deletar somente primeiro hit / match com sed

4
$ echo -e "AsometAhingA\nsomethingA\nASomethiAng"
AsometAhingA
somethingA
ASomethiAng
$ echo -e "AsometAhingA\nsomethingA\nASomethiAng" | sed "s/A//"
sometAhingA
something
SomethiAng
$

Eu sei que sed "s/A//" exclui a primeira correspondência em todas as linhas. Mas quero excluir apenas a primeira correspondência em um arquivo de texto ou fluxo. Como posso fazer isso? Como: sed -i "MAGIC" file.txt

    
por LanceBaynes 23.01.2011 / 11:15

3 respostas

5

Infelizmente, MAGIC não é um comando sed , então você terá que usar outra coisa:

sed -i '0,/A/ s///' file.txt
perl -i -pe 'if (!$changed) {s/A// and $changed++;}' file.txt
echo -e "/A/ s///\nwq" | ed file.txt
    
por 23.01.2011 / 11:40
6

Contanto que seja o GNU sed (o que provavelmente é, já que é o Fedora), você deve ser capaz de fazer:

sed '0,/RE/{//d;}' file.txt
    
por 23.01.2011 / 11:38
2

Se você tem uma versão de sed (não-GNU) que não suporta 0 como um endereço de linha, então você pode fazer isso:

sed '/A/{s///;:a;n;ba}' file.txt

Imprime cada linha como está até encontrar uma com o padrão. Em seguida, elimina o padrão. Depois disso, faz um loop de ba (ramificação para "a") para :a (rótulo "a") e lê e imprime cada linha sem procurar novamente o padrão.

    
por 23.01.2011 / 17:29