Использование sed с целочисленной переменной [дубликат]

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

sed -e 's|<tag1>false</tag1>|<tag1>true</tag1>|g' -i file

, хотя я рекомендую отредактировать копию файла,

sed -e 's|<tag1>false</tag1>|<tag1>true</tag1>|g' file > newfile

и использовать less , чтобы проверить, приемлемо ли новое содержимое; т.е.

less newfile

Отредактировано: обратите внимание на модификатор g в конце шаблона. Это необходимо, если на строке может быть более одного совпадения. Если присутствует g , это означает, что все совпадения в строке заменяются. Кроме того, вместо полных тегов вы можете использовать только

sed -e 's|>false<|>true<|g' file > newfile

или, возможно,

sed -e 's|>[Ff]alse<|>true<|g' file > newfile

, что изменяет оба > false < и > False < на > true <.

Вы можете использовать diff для сравнения двух файлов после использования одной из команд выше. Один из вариантов -

diff --side-by-side file newfile | less

, но он не работает, если строки очень длинные. Обычно используется формат «unified diff» ,

diff -u file newfile | less

где строки, начинающиеся с - , взяты из файла , строки начинаются с + из newfile , и строки, начинающиеся с пробела, являются общими для обоих.

2
16.08.2018, 05:04
2 ответа

Попробуйте это,

  sed -n '1,'$k'p' file

Внутри одинарной кавычки сохраняется все без исключения буквально.

Таким образом, мы можем свести на нет это, добавив одинарные кавычки вокруг переменной.

0
27.01.2020, 22:08

Фон

sedне может расширять переменные оболочки или среды. Скорее вам нужно выбрать кавычки, которые позволяют оболочке Bash выполнять расширение. Когда они заключены в двойные кавычки, Bash будет раскрывать переменные внутри, но не когда они заключены в одинарные кавычки. Чтобы использовать одинарные кавычки, вам нужно сделать что-то вроде этого:

$ sed -n '1,'$k'p' file

УВЕДОМЛЕНИЕ:В приведенном выше примере мы показали переменную $kтак, чтобы она не находилась внутри ни одной из кавычек аргументов, передаваемых в sed. Сделав это, оболочка Bash расширит $kдо любого установленного значения.

Если вы используете двойные кавычки, вы можете использовать нотацию ${var}для защиты переменной в двойных кавычках, чтобы оболочка расширила ее. Ниже требуется нотация ${k}, потому что в противном случае за именем переменной $kбудет следовать p, что приведет оболочку Bash к мысли, что имя переменной — $kp.

$ sed -n "1,${k}p" file

Вы также можете сделать то же самое, поставив пробел между переменной $kи p. Это работает, потому что синтаксис sed допускает пробел между адресом и командой (. Другими словами, пробел передается в sed с этой формой, в отличие от${k}).

$ sed -n "1,$k p" file

ПРИМЕЧАНИЕ.:С этими методами следует соблюдать осторожность, так как они не сработают, если $kне установлено:

$ printf "blah %d\n" $(seq 10) |  sed -n '1,'$k'p'
sed: -e expression #1, char 3: unexpected `,'

Пример

Вот вариант ${k}в двойных кавычках в качестве примера:

$ k="3"; printf "blah %d\n" $(seq 10) |  sed -n "1,${k}p"
blah 1
blah 2
blah 3

оболочка и переменные окружения

Для получения дополнительной информации по этой теме я настоятельно рекомендую вам прочитать вопросы и ответы U&L под названием:В чем разница в использовании между переменными оболочки и переменными среды? .

Ссылки

2
27.01.2020, 22:08

Теги

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