Заменить итеративно с Вещи, содержащиеся в массиве

Разве = не является оператором присваивания?

Да, является, и он также является оператором сравнения, в зависимости от того. он появляется: как и во многих других языках, значение лексем зависит от контекста. Bash поддерживает как присваивание, в форме name=[value], и сравнение, используя языки выражений для test (также известные как как [) и [[; в них = имеет другое значение.

Что такое ${x+X}?

Bash поддерживает синтаксис ${параметр:+слово}:

Использовать альтернативное значение. Если параметр равен нулю или не задан, ничего не будет подставляется, в противном случае подставляется расширение word.

В вашем случае это означает, что если x не задан, то выражение расширится до пустой строки (сравнение с X будет неудачным), а если оно установлено, то оно расширится до X (сравнение даст true).

Синтаксис ${параметр+слово} является вариацией ${параметр:+слово}, с небольшим отличием, когда параметр установлен, но пуст:

x            ${x+alt}   ${x:+alt}
------------ ---------- ----------
unset                ''         ''
set to ''           alt         ''
non-empty           alt        alt
-1
10.09.2018, 05:12
2 ответа

Вы можете сделать это, просто расширив параметры оболочки :Это действительно один -лайнер

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
28.01.2020, 05:07

Я только что попробовал с простым содержимым массива. вы можете применить ту же логику для своего вопроса

$ 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
2
28.01.2020, 05:07

Теги

Похожие вопросы