Wie weise ich sed an, bei Verwendung mehrerer Ersetzungsausdrücke nur einmal zu ersetzen?

Wie weise ich sed an, bei Verwendung mehrerer Ersetzungsausdrücke nur einmal zu ersetzen?

Ich habe mehrere Ersetzungsregeln, möchte aber nur die erste anwendbare Regel verwenden. sedsetzt standardmäßig die Verarbeitung der Ausgabe mit den verbleibenden Regeln fort. Wie breche ich nach der ersten Ersetzung ab? Ist dies möglich, indem nur verwendet wird sed? Ich konnte im Handbuch keine Option finden.

Tatsächliche Leistung

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

three

Gewünschte Operation

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

two

Antwort1

Verwenden Sie den tBefehl nach jedem sBefehl, um zum Ende des Skripts zu verzweigen, wenn eine Ersetzung vorgenommen wurde:

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

Hier twird der Befehl nach der letzten Ersetzung nicht benötigt, aber wenn Sie diesen Code automatisch generieren, können Sie ihn problemlos an jedes Element anhängen s, auch an das letzte.

Antwort2

sed mit Zweig „t“ in einem anderen Befehl ist die perfekte Antwort.

Dies ist nur ein Vorschlag. Falls Sie mehrere Dinge darin tun möchten, wenn es ersetzt wird, können Sie verwendenawk:

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

Antwort3

Diese werden der Reihe nach ausgewertet. Wenn also kein Kreis vorhanden ist und Sie dies problemlos tun können, verwenden Sie einfach

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

Wenn ein Kreis vorhanden ist oder die Liste aus anderen Daten generiert wird, können Sie einen Marker verwenden, z. B.

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

verwandte Informationen