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