Como todos sabemos, sed
é muito eficiente para localizar e substituir cadeia, por exemplo achado 'a' e substituí-lo para 'b': sed 's/a/b/g'
.
É possível fazer isso com outro comando ou script de shell em vez de sed
?
Isto é para sistemas linux cortados para TV que não possuem o sed
comando. Então eu tenho que usar outros comandos ou scripts em vez desed 's/a/b/g'. –
shell
text-processing
binghenzq
fonte
fonte
$var=~s/a/b/g
,gsub(/a/,"b",var)
,var.gsub(/a/,'b')
,var.replace(/a/g,'b')
,preg_replace("/a/","b",$var)
,regsub -all a b $var
. Além disso, muitas ferramentas e idiomas também podem substituir a string de texto sem formatação. Portanto, sua pergunta é de alguma forma ampla.Respostas:
Sim, existem várias maneiras de fazer isso. Você pode usar
awk
,,perl
oubash
para executar essas atividades também. Em geral, porém,sed
é provavelmente a ferramenta mais adequada para realizar esses tipos de tarefas.Exemplos
Digamos que eu tenho esses dados de amostra, em um arquivo
data.txt
:awk
Perl
Edição embutida
Os exemplos acima também podem modificar diretamente os arquivos. O exemplo Perl é trivial. Basta adicionar a
-i
opção.Pois
awk
é um pouco menos direto, mas igualmente eficaz:Este método cria um sub-shell com chaves '{...} `, onde o arquivo é redirecionado para ele através deste:
Depois que o arquivo é redirecionado para o sub-shell, ele é excluído e, em seguida,
awk
é executado no conteúdo do arquivo que foi lido nos sub-shells STDIN. Esse conteúdo é então processadoawk
e gravado novamente no mesmo nome de arquivo que acabamos de excluir, substituindo-o efetivamente.fonte
sed
não eu. Sed é a ferramenta apropriada para fazer substituições como essa, e ele obviamente está pedindo para entender melhor os papéis dessas ferramentas, portanto mostrar a alguém essas coisas, embora seja ruim, é extremamente educativo para mostrar. eles o porquê. Muitas vezes o pessoal que conhece sabe simplesmente diz "não faça" sem explicar o porquê, então eu sou. Mas obrigado por pelo menos deixar um comentário sobre o motivo de você DV.A alternativa clássica para substituições de letra única é o
tr
comando que deve estar disponível em praticamente qualquer sistema:tr
é melhor do quesed
para isso, na verdade, já que usarsed
(para não falar em )perl
ouawk
substituições de uma letra é como usar uma marreta para matar uma mosca.grep
não foi projetado para isso, não modifica sua entrada, apenas pesquisa através dela.Como alternativa, você pode usar os recursos de substituição de alguns shells. Aqui usando
ksh
,zsh
oubash
sintaxe:Poderíamos fornecer respostas mais específicas se você explicasse exatamente qual problema está tentando resolver.
fonte
${foo//a/b}
?echo "$foo" | sed 's/a/b/i
ou dar uma classe de caracteres:echo ${foo//[aA]/b}
.Você pode usar o Vim no modo Ex:
%
selecione todas as linhass
substitutog
substituição globalx
salvar e fecharfonte
Se você estiver trabalhando com um arquivo e não com um fluxo, use o editor de texto padrão
ed
:Isso deve estar disponível em qualquer * nix. A vírgula
',s/a/b/g'
indicaed
para trabalhar em todas as linhas (você também pode usar%
, o que será mais familiar se você estiver acostumado a vim), e o restante é uma pesquisa e substituição padrão.w
diz para gravar (salvar) o arquivo,q
diz para sair.Observe que, ao contrário da
-i
opção do sed (e opções semelhantes em outras ferramentas), isso realmente edita o arquivo no local, em vez de trapacear com arquivos temporários.Eu não acho que é possível fazer isso funcionar com fluxos, mas então eu realmente não sei muito sobre
ed
e não ficaria surpreso se ele realmente tiver essa capacidade (a filosofia unix é o que é).fonte
Usando o comando ed ancestral (no qual
-s
significa silencioso (silencioso) e a vírgula antes dos comandos significa executar em todas as linhas):Apenas imprimindo em STDOUT :
substituição no local:
fonte