Was ist die Verwendung von Mustern vor dem Ersetzungsbefehl in sed

Was ist die Verwendung von Mustern vor dem Ersetzungsbefehl in sed

Hier gibt es ein BeispielVerknüpfungum sed:

Um die erste Zahl in allen Zeilen zu löschen, die mit einem „#“ beginnen, verwenden Sie:

sed '/^#/ s/[0-9][0-9]*//'

Was ist der Vorteil des ersten Musters ( /^#/)? Es könnte einfach sein:

sed 's/^#[0-9][0-9]*//'

Antwort1

Das allgemeine Format der sedBefehle ist

[address[,address]] function

Wenn ein Befehl nur eine Adresse hat, wird er auf allen Zeilen ausgeführt, die dieser Adresse entsprechen. Wenn ein Befehl keine Adresse hat, wird er auf jeder einzelnen Zeile ausgeführt.

Referenz:POSIXsed


Zu Ihren konkreten Beispielen:

  • /^#/ s/[0-9][0-9]*//

    • Dieser Befehl hat eine Adresse, /^#/, die mit allen Zeilen übereinstimmt, die mit einem beginnen #.

    • Das Ersetzungsmuster ist /[0-9][0-9]*/. Dies entspricht der ersten Ziffernfolge, wo immer sie in der Zeile vorkommt.

    • Zusammenfassung in einfachem Englisch: Löschen Sie die erste Ziffernfolge jeder Zeile, die mit einem beginnt #.

    • Beispiel: # non-digits|5555|non-digits|5555wird# non-digits||non-digits|5555

  • s/^#[0-9][0-9]*//

    • Da keine Adresse vorhanden ist, wird dieser Befehl auf jede einzelne Zeile angewendet.

    • Das Substitutionsmuster /^#[0-9][0-9]*/entspricht einer Folge aufeinanderfolgender Ziffern, denen ein# verankertam Anfang der Zeile.

    • Zusammenfassung in einfachem Englisch: Löschen #, gefolgt von einer Ziffernfolge (und nur diesem Muster) vom Anfang jeder Zeile an.

    • Beispiel: #5555|non-digits|5555wird zu |non-digits|5555, # non-digits|5555|non-digits|5555bleibt aber unverändert, da das Ersetzungsmuster nicht übereinstimmt.

Antwort2

Die erste Option passt zu und ersetzt:

#abc99

Der Zweite wird es nicht tun.

Außerdem wird mit dem zweiten auch das anfängliche entfernt #.

verwandte Informationen