Sed remove todas as correspondências do padrão inicial da linha

11

Eu tenho a seguinte linha:

abababtestab

Estou tentando descobrir uma sedexpressão para remover todas as ocorrências do abinício da linha, para que a linha transformada seja:

testab

Eu sinto que isso deve ser simples, mas eu realmente não sei nada sobre isso sed.

O que tenho até agora é:

sed 's/^ab//'

Mas isso apenas remove a primeira ocorrência de ab.

Dan
fonte

Respostas:

16
sed 's/^\(ab\)*//' <in >out

Você deve agrupá-lo.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Alguns s mais antigossed podem não lidar muito bem com isso. Embora a duplicação de subexpressão seja um recurso especificado no POSIX do BRE, alguns seds não o suportam adequadamente. Em alguns deles, porém ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... pode funcionar em seu lugar.

mikeserv
fonte
Exatamente o que eu estava procurando graças! (Eu vou marcar como resposta, uma vez que me permite)
Dan
Até a 7ª edição, sedpor volta de 1979, a apoiou. Teria que ser uma imitação inferior para não lidar com o agrupamento.
Jonathan Leffler
@ JonathanLeffler - veja o POSIX Regular Expression Rationale , que é, em parte, o que eu baseei na declaração. Talvez seja uma suposição, mas há um parágrafo ali ... Os desenvolvedores de padrões consideravam o comportamento histórico comum, que suportava \n*, mas não \n\{min,max\}. \(...\)*, ou \(...\)\{min,max\}, como resultado não intencional de uma implementação específica, e eles suportaram expressões de duplicação e intervalo após subexpressões e referências posteriores.
mikeserv
@ JonathanLeffler: Ele também não funciona com a versão sed dos baús de ferramentas da herança.
cuonglm
@cuonglm - a \(ab\)\1*versão funciona com a herança padrão sede a \(ab\)*versão funciona com a herança SuSv4 sed. Pelo menos, faz para a minha compilação. É verdade que construí meu conjunto de herança contra a musl lib C e, portanto, posso imaginar que isso possa causar um comportamento diferente. Mas geralmente quando um recurso especificado funciona em uma ferramenta de herança SuSv4 da herança, mas não na ferramenta padrão, é porque o desenvolvedor fez isso.
Mikeerv
6

Outro sed:

sed -e ':1' -e 's/^ab//;t1'

Com cada linha de entrada, configuramos um rótulo e :1, em seguida, fazemos a ssubstituição abno início da linha. Se substitution com sucesso, for o tcomando branch a label 1, refaça o trabalho até que nenhum abpadrão apareça no início da linha, estamos prontos.

cuonglm
fonte
Meus pensamentos exatamente. Estritamente, você não precisa de teste: s/^ab//; t1é suficiente
Glenn Jackman
@glennjackman: Ah, claro. Atualizado!
cuonglm