次の文字列の最後の部分から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印刷}」