現在のディレクトリからキーワードを抽出するBashスクリプト

現在のディレクトリからキーワードを抽出するBashスクリプト

次の形式のディレクトリがあります。

/folder1/folder2/name_X_Y_Z_A

ここではX、数字、、、YZ3Aつまたは4つの文字列です。

次のようにシェルスクリプトファイルを作成したいと思います。

  • フォルダ名からX合計を抽出します。Z
  • 文字列の生成/folder1/folder2/name_(X-1)_Y_Z_A
  • string_Z.datこのディレクトリからファイルをコピーする

ここから特定のパターンを抽出する方法がわかりません$PWD。数字の長さと長さが異なる可能性があるため、Xおよびの文字位置は同じである必要はありません。Zname

答え1

まず、シェルのパラメータ置換構文を使用して先行パスコンポーネントを切り取ってから、${PWD##*/}下線をフィールド区切り文字として使用して、デフォルト名を配列として読み取ることができます。

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

bash配列はインデックスが0なので、必要な部分を配置する必要があります${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

これを行うもう1つの方法は、最後がどこにあるかを調べ、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

関連情報