GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Unix-Sed-Tutorial:Fortgeschrittene Sed-Ersetzungsbeispiele

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

ersetzt

Beispiel 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 <<>> am Zeilenanfang bzw. Zeilenende.

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

Linux
  1. Unix Sed Tutorial:So führen Sie mehrere Sed-Befehle aus

  2. UNIX / Linux:10 Netstat-Befehlsbeispiele

  3. 10 Xargs-Befehlsbeispiele in Linux / UNIX

  4. sed-Befehlsbeispiele unter Linux

  5. Ersetzung von Umgebungsvariablen in sed

Unix Sed Tutorial:So schreiben Sie mit Sed in eine Datei

Unix Sed Tutorial:Dateizeilen anhängen, einfügen, ersetzen und zählen

Unix-Sed-Tutorial:6 Beispiele für Sed-Verzweigungsoperationen

Unix Sed Tutorial:7 Beispiele für Sed Hold und Pattern Buffer Operationen

Ping-Tutorial:15 effektive Beispiele für Ping-Befehle

Unix Sed Tutorial:Mehrzeilige Dateioperation mit 6 praktischen Beispielen