Que ferramenta de linha de comando GNU / Linux que eu iria usar para realizar uma pesquisa e substituir em um arquivo?
Pergunta
ferramenta de linha de comando que GNU / Linux que eu iria usar para realizar uma pesquisa e substituir em um arquivo?
Pode o texto de pesquisa e substituição, ser especificado em um formato regex?
Solução
sed 's/a.*b/xyz/g;' old_file > new_file
GNU sed (que você provavelmente tem) é ainda mais versátil:
sed -r --in-place 's/a(.*)b/x\1y/g;' your_file
Aqui está uma breve explicação dessas opções:
-i [SUFFIX], --in-lugar [= SUFFIX] editar arquivos no lugar (faz backup se de extensão fornecido)
-r, --regexp-extended usar expressões regulares estendidas no script.
O FreeBSD versão também suporta estas opções. A NetBSD e OpenBSD versões suportam apenas -r
.
Se você quiser saber mais sobre o sed, Cori sugeriu este tutorial .
Outras dicas
Perl foi inventado para isso:
perl -pi -e 's/foo/bar/g;' *.txt
Qualquer s normais /// padrão nessas aspas simples. Você pode manter uma cópia de segurança com algo parecido com isto:
perl -pi.bak -e 's/foo/bar/g;' *.txt
Ou gasoduto:
cat file.txt | perl -ne 's/foo/bar/g;' | less
Mas isso é realmente mais do sed trabalho.
Considere Ruby como uma alternativa para Perl. Ele roubou a maioria dos argumentos de linha de comando de uma linha de Perl (-i
, -p
, -l
, -e
, -n
) e auto-conjuntos $_
para você como Perl faz e tem muita bondade regex. Além disso sintaxe de Ruby pode ser mais confortável e mais fácil de ler e escrever do que Perl do ou do sed. (Ou não, dependendo do seu gosto).
ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt
vs.
perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt
Em muitos casos, quando se lida com one-liners, o desempenho não é o suficiente de um problema se importar se você usa leve sed ou pesado Perl ou heaveier de peso Ruby. Use o que é mais fácil de escrever.
sed , o editor de fluxo, e sim, ele usa regex.