Мне нужно заменить текст внутри текстового файла на замену. Обычно я делаю что-то вроде
sed -i 's/text/replacement/g' path/to/the/file
Проблема в том, что и text
и replacement
являются сложными строками, содержащими тире, косые черты, черные косые черты, кавычки и т. д. Если я экранирую все необходимые символы внутри, то text
все быстро становится нечитаемым. С другой стороны, мне не нужна мощь регулярных выражений: мне просто нужно подставить текст буквально.
Есть ли способ сделать замену текста?безиспользование регулярных выражений с какой-либо командой bash?
Было бы довольно тривиально написать скрипт, который это делает, но я думаю, что что-то для этого уже должно существовать.
решение1
Если вам не нужна мощь регулярных выражений, не используйте их. Это нормально.
Но это не совсемрегулярное выражение.
sed 's|literal_pattern|replacement_string|g'
Так что, если /
это ваша проблема, используйте |
и вам не придется избегать первого.
PS: По поводу комментариев, также см. этот ответ на StackoverflowЭкранирование строки для шаблона поиска sed.
Обновлять: Если вы в порядке, используяПерлпопробуйте с этим \Q
и \E
вот так,
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
@RedGrittyBrick также предложил аналогичный трюк с более сильным синтаксисом Perl в комментарииздесьилиздесь
решение2
export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file
Это единственное 100% безопасное решение, потому что:
- Это статическая подстановка, а не регулярное выражение, не нужно ничего экранировать (поэтому лучше, чем использовать
sed
). - Он не сломается, если ваша строка содержит
}
символ (таким образом, он превосходит представленное решение Perl) - Он не будет прерываться ни одним символом, потому что
ENV['FIND']
используется , а не$FIND
. При$FIND
встраивании текста в код Ruby вы можете столкнуться с синтаксической ошибкой, если ваша строка содержит неэкранированный'
.
решение3
Команда replace
сделает это.
https://linux.die.net/man/1/replace
Изменение места:
replace text replacement -- path/to/the/file
На стандартный вывод:
replace text replacement < path/to/the/file
Пример:
$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi
Команда replace
поставляется с MySQL или MariaDB.
решение4
Вы также можете использовать механизм Perl \Q
для "метасимволы шаблона кавычек (отключить)"
perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'