Substituição em arquivo de texto **sem** expressões regulares

Substituição em arquivo de texto **sem** expressões regulares

Preciso substituir algum texto dentro de um arquivo de texto por um substituto. Normalmente eu faria algo como

sed -i 's/text/replacement/g' path/to/the/file

O problema é que ambos texte replacementsão strings complexas contendo travessões, barras, barras pretas, aspas e assim por diante. Se eu escapar de todos os caracteres necessários, texta coisa ficará rapidamente ilegível. Por outro lado, não preciso do poder das expressões regulares: só preciso substituir o texto literalmente.

Existe uma maneira de fazer substituição de textosemusando expressões regulares com algum comando bash?

Seria bastante trivial escrever um script que fizesse isso, mas acho que já deveria existir algo.

Responder1

Quando você não precisa do poder das expressões regulares, não as use. Está bem.
Mas, isso não é realmente umexpressão regular.

sed 's|literal_pattern|replacement_string|g'

Então, se /esse for o seu problema, use |e não precisa fugir do primeiro.

PS: Sobre os comentários, veja também esta resposta do Stackoverflow emEscape de uma string para o padrão de pesquisa sed.


Atualizar: Se você estiver bem usandoPerlexperimente \Qe \Eassim,

 perl -pe 's|\Qliteral_pattern\E|replacement_string|g'

@RedGrittyBrick também sugeriu um truque semelhante com sintaxe Perl mais forte em um comentárioaquiouaqui

Responder2

export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file

Esta é a única solução 100% segura aqui, porque:

  • É uma substituição estática, não um regexp, não há necessidade de escapar de nada (portanto, superior a using sed)
  • Não será quebrado se sua string contiver }char (portanto, superior a uma solução Perl enviada)
  • Não vai quebrar com nenhum caractere, porque ENV['FIND']é usado, não $FIND. Com $FINDou seu texto embutido no código Ruby, você poderá encontrar um erro de sintaxe se sua string contiver um '.

Responder3

O replacecomando fará isso.

https://linux.die.net/man/1/replace

Mudança de lugar:

replace text replacement -- path/to/the/file

Para sair padrão:

replace text replacement < path/to/the/file

Exemplo:

$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi

O replacecomando vem com MySQL ou MariaDB.

Responder4

Você também pode usar \Qo mecanismo do Perl para "citar (desativar) metacaracteres de padrão"

perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'

informação relacionada