É 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?
sed
regular-expression
Steve B.
fonte
fonte
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'
Respostas:
Você está pensando demais.
sed
substitui apenas a primeira instância de uma linha por padrão (sem o/g
modificador), 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ê?).fonte
sed
comandos de várias linhas comoN
e rótulos como:a
nã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
.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
fonte