Вы можете использовать
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
, и строки, начинающиеся с пробела, являются общими для обоих.
Попробуйте это,
sed -n '1,'$k'p' file
Внутри одинарной кавычки сохраняется все без исключения буквально.
Таким образом, мы можем свести на нет это, добавив одинарные кавычки вокруг переменной.
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 под названием:В чем разница в использовании между переменными оболочки и переменными среды? .