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 cadeias complexas que contêm traços, barras, barras negras, aspas e assim por diante. Se eu escapar de todos os caracteres necessários, text
a coisa se torna 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 a substituição de texto sem usar expressões regulares com algum comando bash?
Seria bastante trivial escrever um script que faça isso, mas acho que já deveria existir algo.
bash
regex
sed
text-editing
Andrea
fonte
fonte
find and replace all
bash
sempre são enviados com o Microsoft Word? ;) Não, é brincadeira. O OP pode querer fazer isso em uma máquina remota ou para um lote de arquivos.sed
, o que provavelmente é um esforço fútil, considerando todas as opções e diferenças de plataforma.Respostas:
Quando você não precisar do poder das expressões regulares, não o use. Está bem.
Mas, isso não é realmente uma expressão regular .
sed 's|literal_pattern|replacement_string|g'
Portanto, se
/
o problema é seu, use|
e você não precisa escapar do primeiro.ps: sobre os comentários, veja também esta resposta do Stackoverflow em Escape a string for sed search pattern .
Atualização: Se você está bem usando o Perl, experimente
\Q
e\E
com isso,perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrick
também sugeriu um truque semelhante com a sintaxe do Perl mais forte em um comentário aquifonte
s|||
es///
é que o caractere separador é diferente e, portanto, um caractere não precisa ser escapado. Você poderia fazer igualmentes###
. O problema real aqui é que o OP não quer se preocupar em escapar do conteúdo deliteral_pattern
(que não é literal e será interpretado como um regex).1234.*aaa
com a sua solução corresponder muito mais do que o pretendido1234\.\*aaa
.Esta é a única solução 100% segura aqui, porque:
sed
)}
char (portanto, superior a uma solução Perl enviada)ENV['FIND']
é usado, não$FIND
. Com$FIND
ou seu texto embutido no código Ruby, você pode encontrar um erro de sintaxe se a sua string contiver um escape'
.fonte
export FIND='find this; export REPLACE='replace with this';
no meu script bash para issoENV['FIND']
eENV['replace']
tinha os valores esperados. Eu estava substituindo algumas seqüências criptografadas muito longas em um arquivo. Este foi apenas o bilhete.O
replace
comando fará isso.https://linux.die.net/man/1/replace
Mudança no local:
Para stdout:
Exemplo:
O
replace
comando vem com MySQL ou MariaDB.fonte
Você também pode usar o
\Q
mecanismo do perl para " citar (desabilitar) metacaracteres padrão "fonte
perl -pe 's(\Qyour */text/?goes"here")(replacement)' file
confira meu script Perl. ele faz exatamente o que você precisa sem o uso implícito ou explícito da expressão regular:
https://github.com/Samer-Al-iraqi/Linux-str_replace
muito útil né? Eu tive que aprender Perl para fazer isso. porque eu realmente preciso disso.
fonte
Você pode fazer isso escapando de seus padrões. Como isso:
Os créditos para essas soluções estão aqui: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
Nota1: isso funciona apenas para palavras-chave não vazias. Palavras-chave vazias não são aceitas pelo sed (
sed -e 's//replacement/'
).Nota 2: infelizmente, não conheço uma ferramenta popular que NÃO usaria o regexp-s para resolver o problema. Você pode escrever essa ferramenta em Rust ou C, mas não está lá por padrão.
fonte
Reuni algumas outras respostas e cheguei a isso:
fonte
\n
. Qualquer solução?Você pode usar o str_replace do php :
Nota: Você ainda precisará escapar de aspas simples
'
e aspas duplas"
.fonte
Node.JS equivalente a @Nowaker:
fonte
Aqui está mais uma "quase" maneira de trabalhar.
Use vi ou vim.
Crie um arquivo de texto com sua substituição:
execute o vi ou vim na linha de comando:
:% sno é o comando vi para pesquisar e substituir sem mágica.
/ é o meu separador escolhido.
: x salva e sai vi.
Você precisa escapar das barras invertidas '\' a barra forwards '/' pode ser substituída por, por exemplo, um ponto de interrogação '?' ou qualquer outra coisa que não esteja na sua pesquisa ou na sequência de substituição, canal '|' não funcionou para mim tho.
ref: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html
fonte