bash 文字列の抽出

bash 文字列の抽出

次の文字列の最後の部分から2番目のフィールドを抽出したいと思います。

foo_1.103.debug_xx.ver21-inc-1          --> string extracted "debug_xx"
foo_1.103.1.0.release_32_xx.ver21-inc-1 --> string extracted "release_32_xx"
foo_1.103.1.0.release_xx.ver21-inc-1    --> string extracted "release_xx"

どんな助けでも大変感謝します。

答え1

純粋さbash:

IFS='.' read -a p <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'
echo "${p[${#p[@]}-2]}"

以下を使用すると、これを簡単に実行できますawk

awk -F. '{print$(NF-1)}' <<< 'foo_1.103.1.0.release_32_xx.ver21-inc-1'

解析したい文字列がファイル名の場合でも、次のものを使用できますawk

awk -F. 'BEGIN{for(i=1;i<ARGC;i++){$0=ARGV[i];print$(NF-1)}}' foo*

答え2

sedこれを行うコマンド:

sed 's/foo_[0-9.]*\([^.]*\).*/\1/' inputfile

もちろん、inputfile文字列が含まれているとします(例のように)。ファイル名を使用していると仮定すると、結果をパイピングするlsこともsed可能です。

答え3

${VAR%PATTERN}最後のフィールドに対応するサフィックスを削除し、残りの${NEWVAR##PATTERN}最後のフィールドを除くすべてのフィールドに対応するプレフィックスを削除するために使用されます。

all_but_last_field=${mystring%.*}
second_to_last_field=${all_but_last_field##*.}

文字列を変数に保存し、中間結果を変数に保存する必要があります。拡張機能を直接接続することはできません(zshでは可能ですが、bashでは可能ではありません)。

答え4

次のファイルがあるとします。

ls foo * | awk -F。 「{$3印刷}」

関連情報