Dieser Artikel ist Teil der fortlaufenden Serie Unix Sed Tipps und Tricks.
In unseren vorherigen sed-Artikeln haben wir Folgendes gelernt:sed-Drucken, sed-Löschen, sed-Ersatz, sed-Datei schreiben und mehrere sed-Befehle.
Lassen Sie uns in diesem Artikel einige interessante Problemumgehungen mit dem Ersatzbefehl „s“ in sed mit mehreren praktischen Beispielen besprechen.
Ich. Sed Substitution Delimiter
Wie wir in unserem vorherigen Beitrag besprochen haben, können wir verschiedene Trennzeichen wie @ % | verwenden; :in sed Ersatzbefehl.
Lassen Sie uns zuerst eine path.txt-Datei erstellen, die in allen unten genannten Beispielen verwendet wird.
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Beispiel 1 – sed @ Trennzeichen:Ersetzen Sie /opt/omni/lbin durch /opt/tools/bin
Wenn Sie einen Pfadnamen mit „/“ ersetzen, können Sie anstelle von „/“ @ als Trennzeichen verwenden. Im folgenden sed-Beispiel wurde in der letzten Zeile der Eingabedatei /opt/omni/lbin in /opt/tools/bin.
geändert$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
Beispiel 2 – sed / delimiter:Ersetzen Sie /opt/omni/lbin durch /opt/tools/bin
Wenn Sie „/“ in pfadnamenbezogenen Ersetzungen verwenden sollten, müssen Sie „/“ in den Ersetzungsdaten wie unten gezeigt maskieren. In diesem Sed-Beispiel wurde das Trennzeichen „/“ im REGEXP- und REPLACEMENT-Teil maskiert.
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed '&' Get Matched String
Der genaue Teil einer Eingabezeile, auf den der reguläre Ausdruck passt, wird durch &dargestellt, das dann im Ersetzungsteil verwendet werden kann.
Beispiel 1 – sed &Verwendung:Ersetzen Sie /usr/bin/ durch /usr/bin/local
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Im obigen Beispiel wird „&“ im Ersatzteil durch /usr/bin ersetzt, das dem Muster entspricht, und durch /local hinzugefügt. Daher werden in der Ausgabe alle Vorkommen von /usr/bin durch /usr/bin/local
ersetztBeispiel 2 – sed &Usage:Passen Sie die ganze Zeile an
&ersetzt alle Übereinstimmungen mit dem gegebenen REGEXP.
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
Im obigen Beispiel hat regexp „^.*$“, was auf die ganze Zeile passt. Ersatzteil <<<&>>> schreibt die ganze Zeile mit <<
III. Gruppierung und Rückverweise in Sed
Die Gruppierung kann in sed wie ein normaler regulärer Ausdruck verwendet werden. Eine Gruppe wird mit „\(“ geöffnet und mit „\)“ geschlossen. Gruppierung kann in Kombination mit Rückverweisen verwendet werden.
Rückverweis ist die Wiederverwendung eines durch Gruppierung ausgewählten Teils eines regulären Ausdrucks. Rückverweise in sed können sowohl in einem regulären Ausdruck als auch im Ersetzungsteil des Ersetzungsbefehls verwendet werden.
Beispiel 1:Nur den ersten Pfad in jeder Zeile erhalten
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
Im obigen Beispiel stimmt \(\/[^:]*\) mit dem Pfad überein, der verfügbar ist, bevor first :kommt. \1 ersetzt die erste übereinstimmende Gruppe.
Beispiel 2:Mehrfachgruppierung
Ändern Sie in der Datei path.txt die Reihenfolge der Felder in der letzten Zeile der Datei.
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
Im obigen Befehl $ gibt die Ersetzung nur für die letzte Zeile an. Die Ausgabe zeigt, dass die Reihenfolge der Pfadwerte in der letzten Zeile umgekehrt wurde.
Beispiel 3:Holen Sie sich die Liste der Benutzernamen in der Datei /etc/passwd
Dieses sed-Beispiel zeigt nur das erste Feld aus der Datei /etc/passwd.
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
Beispiel 4:Erstes Zeichen jedes Wortes in Klammern setzen
Dieses sed-Beispiel gibt das erste Zeichen jedes Wortes in Klammern aus.
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
Beispiel 5:Kommifizieren Sie die einfache Zahl.
Lassen Sie uns eine Datei mit dem Namen Nummern erstellen, die eine Liste von Nummern enthält. Das folgende sed-Befehlsbeispiel wird verwendet, um die Zahlen bis zu Tausend zu komprimieren.
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123