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

Используйте -H опция, которая делает команду выполняемой с sudo рассматривать 'домой' корневой каталог пользователя. Можно найти более подробное объяснение на странице справочника sudo: http://linux.die.net/man/8/sudo

62
09.09.2018, 13:23
10 ответов

'оперативный' sed (использующий флаг-i) был ответом. Благодаря peterph.

sed -i "s@$old@$new@" file
21
27.01.2020, 19:32
  • 1
    У Вас есть кавычки в неправильном месте. кавычки должны быть вокруг переменных, нет s@ (который не является особенным для оболочки всегда). Лучше всего должен поместить все в кавычках как sed -i "s@$old@$new@" file. Отметьте это -i не стандарт sed опция. –  Stéphane Chazelas 26.03.2013, 16:20
  • 2
    , как я могу выйти $ в этой команде. Как, я собираюсь измениться $xxx в целом к значению переменной $JAVA_HOME. Я попробовал sed -i "s@\$xxx@$JAVA_HOME@" file, но ошибка говорит no previous regular expression –  hakunami 06.11.2014, 10:07

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

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

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

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

45
27.01.2020, 19:32
  • 1
    я использовал одинарную кавычку в sed параметрических усилителях, переключенных на двойные кавычки и она работала файл.Потрясающе. –  Aakash 28.07.2016, 11:30
  • 2
    это не это sed один не будет использовать regex, но sed -E был бы? –  Kiwy 24.04.2018, 13:04
  • 3
    @Kiwy, нет. -e должен указать a sed выражение, таким образом, можно передать больше чем один (как в sed -e exp1 -e exp2) или комбинации файлов и выражений (sed -f file -e exp). Можно сбивать с толку с -E который с некоторыми реализациями, говорит sed использовать EREs вместо BREs. –  Stéphane Chazelas 24.04.2018, 13:06
  • 4
    , который я ввел с опечаткой, но хорошо, которые объясняют, почему у меня есть столько проблем с помощью sed без -E Я только осваиваю расширенный regex не регулярный. Спасибо за explanaiton. –  Kiwy 24.04.2018, 13:12
  • 5
    @Kiwy, см. также связанные Вопросы и ответы для большего количества опций, поддерживаемых некоторыми sed реализации для еще более синтаксисов регулярного выражения. –  Stéphane Chazelas 24.04.2018, 13:18

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

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

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

31
27.01.2020, 19:32
  • 1
    Вам не нужна кошка, mv, или дополнительный, '' если Вы не собираетесь иметь специальные символы в них. Таким образом, это sed -i s/"$old"/"$new"/ update_via_sed.sh. Однако знайте, что это не работает ни на какое значение старых и новых. например, это не должно содержать / и т.д., поскольку $old является все еще поиском и $new заменяющий шаблон, где некоторые символы имеют особые значения. –  frostschutz 25.03.2013, 18:25
  • 2
    sed -i "s/$old/$new/" в порядке также (с вышеупомянутыми мерами предосторожности). sed обычно полагает, что разделитель первый символ после s команда - т.е. если Ваши переменные содержат наклонные черты / но не позволяет, говорят в (@), можно использовать "s@ $old@$new". –  peterph 25.03.2013, 19:23

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

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

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

sed "s|$var|r_str|g" file_name >new_file
22
27.01.2020, 19:32

man bash дает это об одинарных кавычках

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

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

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

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

3
29.04.2021, 00:50

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

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

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

-3
29.04.2021, 00:50

Рискую проявить легкомыслие - не рассматривали ли вы perl .

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

Это выглядит как в вашем примере, то, что вы на самом деле пытаетесь сделать, это увеличить число.

А как насчет:

#!/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'
1
20.08.2021, 13:14
$ 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}", это была ошибка.

2
20.08.2021, 13:14

разорвать нить

плохо => linux видим строку $old _запускаем:

sed 's/$old_run/$new_run/'

хорошо => linux смотрите переменную $old _run:

sed 's/'$old_run'/'$new_run'/'
-3
20.08.2021, 13:14

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

perl -pi -e ""s/$val1/$val2/g"" file
-4
20.08.2021, 13:14

Теги

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