Я хочу делать:
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}/'
Ответы:
Вы могли бы сделать:
Но будьте осторожны,
$old_run
это будет восприниматься как регулярное выражение и любые специальные символы, содержащиеся в переменной, такие как/
или.
должны быть экранированы . Точно так же, в$new_run
,&
и\
символы и должны быть обработаны специально, и вам придется экранировать/
символы и новой строки в нем.Если содержимое
$old_run
или$new_run
вы не находитесь под вашим контролем, тогда крайне важно выполнить это экранирование или иным образом этот код равносильно уязвимости внедрения кода .источник
sed
один не будет использовать регулярные выражения, ноsed -E
будет?-e
чтобы указатьsed
электронную XPression , так что вы можете передать более одного (как вsed -e exp1 -e exp2
) или комбинации файлов и выражений (sed -f file -e exp
). Возможно, вы-E
путаетесь с тем, что с некоторыми реализациями, говорит sed использовать ERE вместо BRE.-E
меня, я только осваиваю расширенное регулярное выражение, а не обычное. Спасибо за объяснение.sed
реализациями для еще большего количества синтаксисов регулярных выражений.Это сработало:
Поскольку я хочу «повторно использовать» один и тот же файл, я фактически использую это для всех, кто желает подобного подхода:
Выше созданный новый файл затем удаляет текущий файл, а затем переименовывает новый файл в текущий файл.
источник
sed -i s/"$old"/"$new"/ update_via_sed.sh
. Однако имейте в виду, что это не работает для любого значения старого и нового. например, он не должен содержать / и т. д., поскольку $ old по-прежнему является поиском, а $ new - шаблоном замены, где некоторые символы имеют специальные значения.sed -i "s/$old/$new/"
тоже хорошо (с вышеуказанными мерами предосторожности).sed
обычно считает разделитель первым символом послеs
команды - то есть, если ваши переменные содержат косую черту,/
но не позволяют, скажем, at (@
), вы можете использовать "s @ $ old @ $ new @".Вы можете использовать переменные в sed, если они заключены в двойные кавычки (а не в одинарные):
Если
/
в переменной есть косая черта ( ), используйте другой разделитель, как показано нижеисточник
|
как в моем случае, переменных содержит путь, поэтому он имеет/
в нем|
работала у меня на MacOS 10.14, но другие разделители любят@
или#
нет. У меня были косые черты в моем env var тоже.'in-place' sed (используя флаг -i) был ответом. Спасибо Петерф.
источник
s@
(что не является особенным для оболочки). Лучше всего поместить все в кавычки, какsed -i "s@$old@$new@" file
. Обратите внимание, что-i
это не стандартнаяsed
опция.$
в этой команде. Мол, я собираюсь изменить$xxx
в целом значение переменной$JAVA_HOME
. Я пыталсяsed -i "s@\$xxx@$JAVA_HOME@" file
, но ошибка говоритno previous regular expression
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. Таким образом, некоторые символы, такие как `, должны быть экранированы перед их использованием.
источник
На риск быть легкомысленным - вы рассмотрели
perl
.Который, помимо прочего, неплохо справляется с операциями 'sed style', но также и с более полнофункциональным программированием.
В вашем примере похоже , что вы на самом деле пытаетесь увеличить число.
Так как насчет:
или как один лайнер - стиль седа:
источник
В
$d1
Я хранение значенийЯ не могу заменить значение из переменной, поэтому я попробовал следующую команду, она работает
пропущена двойная кавычка
"${d1}"
, это была ошибкаисточник
Предполагается
$old_run
и$new_run
уже установлены:Это показывает изменение на экране. При необходимости вы можете перенаправить вывод в файл.
источник
Для использования переменной в sed используйте двойные кавычки "", чтобы заключить переменную в шаблон, который вы используете. Например: a = "Hi" Если вы хотите добавить переменную 'a' к шаблону, вы можете использовать следующее: sed -n "1, / pattern" $ {a} "pattern / p" filename
источник
$a
в кавычки, что означает, что любые пробелы в его значении будут вызывать разбиение слов в оболочке.Вы также можете использовать Perl:
источник
""
) ничего не сделают.сломать строку
bad => linux видит строку $ old_run:
good => linux видит переменную $ old_run:
источник
$old_run
или$new_run
содержит пробелы?