Ich habe mehrere Ersetzungsregeln, möchte aber nur die erste anwendbare Regel verwenden. sed
setzt 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 t
Befehl nach jedem s
Befehl, 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 t
wird 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