Bash 脚本从当前目录中提取关键字

Bash 脚本从当前目录中提取关键字

我有一个以下格式的目录:

/folder1/folder2/name_X_Y_Z_A

其中X是数字,YZA是 3 或 4 个字符长的字符串。

我想编写一个 shell 脚本文件来执行以下操作:

  • 从文件夹名称中提取XZ
  • 创建字符串/folder1/folder2/name_(X-1)_Y_Z_A
  • string_Z.dat从该目录复制文件

我不知道如何从 中提取特定模式$PWDX和的字符位置Z不必相同,因为数字长度和 的长度name可以不同。

答案1

您可以首先使用 shell 的参数替换语法修剪前导路径组件${PWD##*/},然后使用下划线作为字段分隔符将基本名称读入数组:

IFS=_ read -a arr <<< "${PWD##*/}"

由于 bash 数组是零索引的,因此您想要的部分应该位于${arr[1]}例如${arr[3]}

newdir="/folder1/folder2/name_$((${arr[1]}-1))_${arr[3]}_Z_A"

[注意:我假设您指的是算术结果(X-1)而不是文字字符串。]

答案2

假设 X,Y,Z,A 中没有任何下划线,那么我们每次都可以“剪掉”尾巴

例如

# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA

A=${DIR##*_} ; DIR=${DIR%_*}
Z=${DIR##*_} ; DIR=${DIR%_*}
Y=${DIR##*_} ; DIR=${DIR%_*}
X=${DIR##*_} ; DIR=${DIR%_*}

let X=X-1
DIR="${DIR}_${X}_${Y}_${Z}_${A}"

echo $DIR

我们可以做到这一点的另一种方法是找出X结束位置并一次性剥离其余部分:

# DIR=$PWD
# example:
DIR=/folder1/folder2/name_100_YYYY_ZZZZ_AAAA

DIRX=${DIR%_*_*_*}

YZA=${DIR#$DIRX}
X=${DIRX##*_} ; DIRX=${DIRX%_*}

let X=X-1
DIR="${DIRX}_${X}${YZA}"

echo $DIR

在这两种情况下我们都会得到/folder1/folder2/name_99_YYYY_ZZZZ_AAAA结果。您可以轻松地将cp您的文件放入其中。

答案3

如果你可以使用Python:

$ pwd=/folder1/folder1/name_10_ABCD_ABC_ABCD # or use $PWD
$ new=$(python -c "import os; x='"$pwd"'.rsplit('/', 1)[1].split('_'); x[1]=str(int(x[1])+1); print('_'.join(x))")
$ echo $new
name_11_ABCD_ABC_ABCD

相关内容