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 text
e replacement
são strings complexas contendo travessões, barras, barras pretas, aspas e assim por diante. Se eu escapar de todos os caracteres necessários, text
a 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 \Q
e \E
assim,
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$FIND
ou seu texto embutido no código Ruby, você poderá encontrar um erro de sintaxe se sua string contiver um'
.
Responder3
O replace
comando 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 replace
comando vem com MySQL ou MariaDB.
Responder4
Você também pode usar \Q
o 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'