Заменить шаблон многострочным текстом в скрипте bash - PullRequest
0 голосов
/ 23 мая 2018

У меня есть переменная bash:

VAR="This is \n what i want"

и файл со следующим содержимым:

asdf
zxcv
qwer

Я хотел бы заменить каждое вхождение zxcv значением $ VAR (многострочный текст)

Как это сделать с помощью awk или sed?Я попробовал:

sed -i 's/zxcv/'$VAR'/g' filename
sed -i "s/zxcv/$VAR/g" filename
sed -i "s/zxcv/$(VAR)/g" filename
sed -i "s/zxcv/$(($VAR))/g" filename
sed -i "s/zxcv/`echo -n $VAR`/g" filename

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы также можете использовать GNU sed:

$ var="This is \n what i want"
$ sed "s/^zxcv/$var/" file
asdf
This is 
 what i want
qwer

Ключ использует двойные кавычки против одинарных кавычек, поэтому значение $var вставляется в строку замены sed.

(кстати, как обычно, используйте строчные буквы в Bash для пользовательских переменных.)


Из комментариев: версия Эда Мортона намного лучше, если использовать конкатенацию строк и показывать только компонент переменнойОболочка интерпретации:

$ sed 's/^zxcv/'"$var"'/' file

Используйте это

0 голосов
/ 23 мая 2018

Используя gnu-awk, вы можете сделать это, передав значение переменной в командной строке:

var=$'This is \n what i want'

awk -v var="$var" -v w='zxcv' 'n=index($0, w){
$0 = substr($0, 1, n-1) var substr($0, n + length(w))} 1' file

asdf
This is
 what i want
qwer

Если поисковое слово появляется в отдельной строке (как показано навопрос) тогда эту команду можно упростить до этого:

awk -v var="$var" -v w='zxcv' 'index($0, w)==1{$0 = var} 1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...