Подстановка в текстовом файле **без** регулярных выражений

Подстановка в текстовом файле **без** регулярных выражений

Мне нужно заменить текст внутри текстового файла на замену. Обычно я делаю что-то вроде

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'

Связанный контент