foo bar, foo bar, foo bar
foo bar
bar
この美しい詩を考えると、それらをすべて置き換えることができますが、superman
配列に含まれて毎回異なるエンディングを持つことはどのように可能ですか?(is super, is blazing fast, is marvelous, cawabanga)
結果は次のとおりです。
foo superman is super, foo superman is blazing fast, foo superman is marvelous
foo superman cawabanga
for/loop と sed を使用してこれを行うことができることを知っています。しかし、より短く、審美的により満足のいく解決策がありますか?
答え1
これは、シェルパラメータ拡張によって簡単に実行できます。これは実際には簡単な説明です。
poem='foo bar, foo bar, foo bar
foo bar'
traits=( "is super" "is blazing fast" "is marvelous" "cawabanga" )
for trait in "${traits[@]}"; do poem=${poem/bar/"superman $trait"}; done
echo "$poem"
foo superman is super, foo superman is blazing fast, foo superman is marvelous
foo superman cawabanga
答え2
ちょうど簡単な配列の内容を試してみました。問題に同じロジックを適用できます。
$ declare -a var=(A B C D)
$ cat test.txt
foo bar, foo bar, foo bar
foo bar
$ awk -vArr="${var[*]}" 'BEGIN {split(Arr,awk_arr," ")}{for(i=1;i<=NF;i++)if($i~/bar/){count++;$i=awk_arr[count]}}1' test.txt
foo A foo B foo C
foo D