Substituindo a primeira ocorrência de um padrão em uma linha, por todas as linhas em um arquivo com sed

16

É possível fazer isso em um forro?

Eu tenho uma saída como esta:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

Esta entrada é gerada automaticamente.

Quero substituir a primeira ocorrência de "(aspas + espaço) por "(aspas) para cada linha. Se eu aplicar a substituição globalmente, ela também mudará todas as ocorrências de line" -para line"-, então eu queria saber se é possível usar um liner sed one para fazer isso.

Eu tentei usar ^assim

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

Mas não está funcionando, não substitui nada. eu tentei

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

e substitui todas as ocorrências. Comecei a usar o sed, então não sei se estou fazendo algo errado.

O que estou perdendo aqui?

Steve B.
fonte
Uma observação sobre rótulos: O comando que você escreveu acima pode funcionar em algumas implementações de sed, mas, para portabilidade e para evitar erros realmente estranhos, você deve encerrar um determinado argumento de comando após um rótulo (se você precisar deles). Por exemplo,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard

Respostas:

34

Você está pensando demais. sedsubstitui apenas a primeira instância de uma linha por padrão (sem o /gmodificador), embora você ainda deseje ancorar porque não deseja tanto a primeira instância na linha quanto a do início da linha; e você geralmente não precisa das ações de linha explícitas que está tentando usar (por quê?).

sed 's/^" /"/'
geekosaur
fonte
Obrigado! Eu pensei que era necessário declarar explicitamente as ações da linha ao trabalhar em um arquivo, ler sobre ele e continuar usando-as. Eu realmente foi sobre a pensar que, que não poderia ser mais simples e ele faz o truque :)
Steve B.
Estou tentado a dizer que esses comandos são praticamente obsoletos; é possível fazer coisas multilinhas bastante complexas com elas, mas não é fácil fazer isso e hoje em dia é melhor usar perl / python / ruby ​​/ qualquer outra coisa.
Geekosaur
Discordo completamente do comentário acima; sedcomandos de várias linhas como Ne rótulos como :anão são obsoletos e são portáteis e especificados para POSIX , diferentemente do Perl / Python / Ruby / qualquer que seja. É verdade, porém, que se você precisar deles com frequência, deve aprenderawk .
Curinga
2

Uma resposta mais geral, já que não posso comentar sobre a resposta de geekosaur - você não colocaria o ^ (âncora no início da linha). Por exemplo, se você deseja substituir a primeira ocorrência de A por B, teria

sed 's/A/B/'
espectro
fonte