Intereting Posts
Нет xorg.conf, это framebufferCompression отключено, возможно без? как перезагрузить замороженный сервер FreeBSD с последовательной консоли? Debian – System (аудио) Настройки, нарушающие при запуске / остановке LXC Parted: создание раздела fat32 на новом диске не монтируется должным образом, используется устройство loop Безопасный Linux для использования на рабочем месте Как устранить проблему репозитория yum с ошибкой «Нет пакета … доступной»? Как установить параметры по умолчанию для htop? Как запустить «gdbserver» в фоновом режиме? Где находится документация по первичным событиям? Как установить драйверы rtlwifi на установочный USB-диск Debian? Как создать ZFS Zpool, который GRUB может читать Недопустимый аргумент Richacl при попытке установить атрибуты Конфигурация совместного доступа в двух направлениях (модем с одной машиной на другую) chmod -R 644 ~ / Документы Проблема установки Okular из ppa под Ubuntu

Как я могу использовать переменные при выполнении sed?

Я хочу делать:

cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh 

в моей программе.

Но я хочу использовать переменные, например

 old_run='old_name_952' new_run='old_name_953' 

Я попытался использовать их, но замена не происходит (нет ошибки). Я пытался:

 cat update_via_sed.sh | sed 's/old_run/new_run/' cat update_via_sed.sh | sed 's/$old_run/$new_run/' cat update_via_sed.sh | sed 's/${old_run}/${new_run}/' 

Вы можете сделать:

 sed "s/$old_run/$new_run/" < infile > outfile 

Но будьте осторожны, что $old_run будет принято как регулярное выражение и поэтому любые специальные символы, которые содержит переменная, например / . необходимо было бы избежать . Аналогично, в $new_run необходимо обработать символы & и \ и вам придется избегать символов / и символов новой строки.

Если содержимое $old_run или $new_run не находится под вашим контролем, тогда очень важно выполнить это экранирование, иначе код будет иметь уязвимость при инъекции кода .

Это сработало:

 cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/' 

Поскольку я хочу «повторно использовать» тот же файл, я действительно использую его для тех, кто хочет аналогичного подхода:

 cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/' > new_update; mv -f new_update update_via_sed.sh 

Вышеупомянутый созданный новый файл затем удаляет текущий файл, чем переименование нового файла в качестве текущего файла.

«in-place» sed (usng -i flag) был ответом. Благодаря петерфу.

 sed -i "s@$old@$new@" file 

Вы можете использовать переменные в sed до тех пор, пока они находятся в двойной кавычки (не одна цитата):

 sed "s/$var/r_str/g" file_name >new_file 

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

 sed "s|$var|r_str|g" file_name >new_file 

man bash дает о единичном цитировании

Вложения символов в одинарных кавычках сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Независимо от того, что вы вводите в командной строке, bash интерпретирует его, а затем отправляет результат в программу, к которой он должен быть отправлен. В этом случае, если вы используете sed 's/$old_run/$new_run/' , bash сначала видит sed , он распознает его как исполняемый файл, присутствующий в $PATH . Для исполняемого файла sed требуется ввод. Баш ищет вход и находит 's/$old_run/$new_run/' . Одиночные кавычки говорят, что они не интерпретируют содержание в них и не передают их, как они есть. Итак, bash затем передает их в sed. Sed дает ошибку, потому что $ может встречаться только в конце строки.

Вместо этого, если мы используем двойные кавычки, т. "s/$old_run/$new_run/" , bash видит это и интерпретирует $old_run как имя переменной и делает замену (эта фаза называется переменным расширением). Это действительно то, что нам нужно.

Но вы должны быть осторожны, используя двойные кавычки, потому что они интерпретируются сначала bash, а затем передаются sed. Таким образом, некоторые символы, подобные `, должны быть экранированы перед их использованием.

В опасности быть легкомысленным – считали ли вы perl .

Который, среди прочего, неплохо справляется с операциями «sed style», но также более полнофункциональный программный стиль.

Похоже, что в вашем примере то, что вы на самом деле пытаетесь сделать, – это увеличить число.

Итак, как насчет:

 #!/usr/bin/env perl use strict; use warnings 'all'; while ( <DATA> ) { s/old_name_(\d+)/"old_name_".($1+1)/e; print; } __DATA__ old_name_932 

или как один лайнер – sed стиль:

 perl -pe 's/old_name_(\d+)/"old_name_".($1+1)/e' 
 $ echo $d1 | sed -i 's/zkserver1/'${d1}'/g' deva_file sed: -e expression #1, char 26: unterminated `s' command 

В $d1 я храню значения

Я не могу заменить значение из переменной, поэтому я попробовал следующую команду: он работает

 echo $d1 | sed -i 's/zkserver1/'"${d1}"'/g' deva_file 

отсутствующая двойная кавычка в "${d1}" , это была ошибка

Для использования переменной в sed используйте двойные кавычки «», чтобы заключить эту переменную в шаблон, который вы используете. Например: a = «Привет». Если вы хотите добавить переменную 'a' к шаблону, вы можете использовать следующее: sed -n "1, / pattern" $ {a} "pattern / p" filename

Предполагается, что $old_run и $new_run уже установлены:

 cat update_via_sed.sh | eval $(print "sed 's/$old_run/$new_run/g'") 

Это показывает изменение на экране. При необходимости вы можете перенаправить вывод в файл.

со всем уважением, ответы выше, вам просто нужно сломать строку:

bad, linux см. строку $ old_run:

 sed 's/$old_run/$new_run/' 

хорошо, linux видит переменную $ old_run:

 sed 's/'$old_run'/'$new_run'/'