Используйте -H
опция, которая делает команду выполняемой с sudo
рассматривать 'домой' корневой каталог пользователя. Можно найти более подробное объяснение на странице справочника sudo: http://linux.die.net/man/8/sudo
'оперативный' sed (использующий флаг-i) был ответом. Благодаря peterph.
sed -i "s@$old@$new@" file
Вы могли сделать:
sed "s/$old_run/$new_run/" < infile > outfile
Но остерегайтесь этого $old_run
был бы взят в качестве регулярного выражения и так любые специальные символы, которые переменная содержит, такой как /
или .
должен был бы быть оставлен. Точно так же в $new_run
, &
и \
символы должны были бы рассматривать особенно, и необходимо будет выйти /
и символы новой строки в нем.
Если содержание $old_run
или $new_run
не находится под Вашим контролем, затем очень важно выполнить тот выход, или иначе что объемы кода к уязвимости инжекции кода.
-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
-E
Я только осваиваю расширенный regex не регулярный. Спасибо за explanaiton.
– Kiwy
24.04.2018, 13:12
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
Вышеупомянутое создало новый файл, затем удаляет текущий файл, чем переименовывают новый файл, чтобы быть текущим файлом.
sed -i s/"$old"/"$new"/ update_via_sed.sh
. Однако знайте, что это не работает ни на какое значение старых и новых. например, это не должно содержать / и т.д., поскольку $old является все еще поиском и $new заменяющий шаблон, где некоторые символы имеют особые значения.
– frostschutz
25.03.2013, 18:25
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
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. Таким образом, некоторые символы, такие как `, должны быть экранированы перед их использованием.
Предполагается, что $old_run
и $new_run
уже установлены:
cat update_via_sed.sh | eval $(print "sed 's/$old_run/$new_run/g'")
Это показывает изменения на экране. При необходимости можно перенаправить вывод в файл.
Рискую проявить легкомыслие - не рассматривали ли вы 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'
$ 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}"
, это была ошибка.
разорвать нить
плохо => linux видим строку $old _запускаем:
sed 's/$old_run/$new_run/'
хорошо => linux смотрите переменную $old _run:
sed 's/'$old_run'/'$new_run'/'
Вы также можете использовать Perl:
perl -pi -e ""s/$val1/$val2/g"" file
s@
(который не является особенным для оболочки всегда). Лучше всего должен поместить все в кавычках какsed -i "s@$old@$new@" file
. Отметьте это-i
не стандартsed
опция. – Stéphane Chazelas 26.03.2013, 16:20$
в этой команде. Как, я собираюсь измениться$xxx
в целом к значению переменной$JAVA_HOME
. Я попробовалsed -i "s@\$xxx@$JAVA_HOME@" file
, но ошибка говоритno previous regular expression
– hakunami 06.11.2014, 10:07