Como instruir o sed a substituir apenas uma vez ao usar múltiplas expressões substitutas?

Como instruir o sed a substituir apenas uma vez ao usar múltiplas expressões substitutas?

Tenho várias regras de substituição, mas quero usar apenas a primeira regra aplicável. sed, por padrão, continua processando a saída com as regras restantes. Como faço para quebrar após a primeira substituição? É possível usar apenas sed? Não encontrei nenhuma opção no manual.

Produção real

$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"

three

Operação desejada

$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"

two

Responder1

Use o tcomando após cada scomando para ir até o final do script se uma substituição tiver sido feita:

sed -e 's/something/else/;t' \
    -e 's/one/two/;t' \
    -e 's/two/three/;t' <<<"one"

Aqui, o tcomando após a última substituição não é necessário, mas se você gerar esse código automaticamente, não há problema em deixá-lo sufixar each s, até mesmo o último.

Responder2

sed com branch 't' em outro comando é a resposta perfeita.

Esta é apenas uma sugestão, caso você queira fazer várias coisas dentro se for substituído, você pode usarestranho:

awk ' { if (gsub("something","else",$0) || gsub("one","two",$0) || gsub("two","three",$0) ){ print $0;exit}; }' <<<"one"

Responder3

Eles são avaliados em ordem, portanto, se não houver círculo e você puder fazer isso facilmente, basta usar

s/two/three/; s/one/two/; s/something/else/

Se houver um círculo ou se a lista for gerada a partir de outros dados, você poderá usar um marcador, por exemplo

s/@/@@/g
s/one/t@wo/
s/two/t@hree/
s/something/e@lse/
s/@\(.\)/\1/g

informação relacionada