Stream Editor - Nützliche Rezepte

SED ist ein erstaunliches Dienstprogramm, das mehrere Möglichkeiten zur Lösung eines Problems bietet. Dies ist der UNIX-Weg und SED beweist dies perfekt. GNU / Linux bietet viele nützliche Dienstprogramme für die Ausführung alltäglicher Aufgaben. Lassen Sie uns einige Dienstprogramme mit SED simulieren. Manchmal scheint es, als würden wir ein einfaches Problem auf die harte Tour lösen, aber der Zweck besteht nur darin, die Leistungsfähigkeit von SED zu demonstrieren.

Katzenbefehl

Im folgenden Beispiel wird jede Zeile als Teil des Standardworkflows gedruckt.

[jerry]$ sed '' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

Im folgenden Beispiel wird der Befehl print verwendet, um den Dateiinhalt anzuzeigen.

[jerry]$ sed -n 'p' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

Leere Linien entfernen

Im folgenden Beispiel impliziert "^ $" eine leere Zeile, und leere Zeilen werden gelöscht, wenn eine Musterübereinstimmung erfolgreich ist.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1 
Line #2

In ähnlicher Weise wird im folgenden Beispiel die Zeile nur gedruckt, wenn sie nicht leer ist.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1 
Line #2

Kommentierte Zeilen aus einem C ++ - Programm entfernen

Lassen Sie uns ein Beispielprogramm für C ++ erstellen.

#include <iostream> 
using namespace std; 

int main(void) 
{ 
   // Displays message on stdout. 
   cout >> "Hello, World !!!" >> endl;  
   return 0; // Return success. 
}

Entfernen Sie nun die Kommentare mit dem folgenden regulären Ausdruck.

[jerry]$ sed 's|//.*||g' hello.cpp

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

#include <iostream>
using namespace std; 

int main(void) 
{ 
   cout >> "Hello, World !!!" >> endl; 
   return 0;  
}

Hinzufügen von Kommentaren vor bestimmten Zeilen

Im folgenden Beispiel werden Kommentare vor den Zeilennummern 3 bis 5 hinzugefügt.

[jerry]$ sed '3,5 s/^/#/' hello.sh

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

Wc -l Befehl

Der Befehl "wc -l" zählt die Anzahl der in der Datei vorhandenen Zeilen. Der folgende SED-Ausdruck simuliert dasselbe.

[jerry]$ sed -n '$ =' hello.sh

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

8

Oberbefehl

Standardmäßig druckt der Befehl head die ersten 10 Zeilen der Datei. Simulieren wir dasselbe Verhalten mit SED.

[jerry]$ sed '10 q' books.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage
Paulo Coelho

Tail -1 Befehl

Der "Schwanz -1" druckt die letzte Zeile der Datei. Die folgende Syntax zeigt die Simulation.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1 
Line #2

Schreiben wir das SED-Skript.

[jerry]$ sed -n '$p' test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #2

Dos2unix-Befehl

In einer DOS-Umgebung wird eine neue Zeile durch eine Kombination von CR / LF-Zeichen dargestellt. Die folgende Simulation des Befehls "dos2unix" konvertiert ein DOS-Zeilenumbruchzeichen in ein UNIX-Zeilenumbruchzeichen. In GNU / Linux wird dieses Zeichen häufig als "^ M" -Zeichen (Control M) behandelt.

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
[jerry]$ file test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

test.txt: ASCII text, with CRLF line terminators

Simulieren wir den Befehl mit SED.

[jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
"^M" character. 
[jerry]$ file new.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

new.txt: ASCII text

Lassen Sie uns nun den Dateiinhalt anzeigen.

[jerry]$ cat -vte new.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1$ 
Line #2$

Unix2dos-Befehl

Ähnlich wie bei "dos2unix" gibt es den Befehl "unix2dos", der das UNIX-Zeilenumbruchzeichen in das DOS-Zeilenumbruchzeichen konvertiert. Das folgende Beispiel zeigt die Simulation derselben.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

test.txt: ASCII text

Simulieren wir den Befehl mit SED.

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

new.txt: ASCII text, with CRLF line terminators

Lassen Sie uns nun den Dateiinhalt anzeigen.

Now let us display the file contents.

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1^M$ 
Line #2^M$

Cat-E-Befehl

Der Befehl "cat -E" zeigt das Zeilenende nach Dollar ($) an. Das folgende SED-Beispiel ist eine Simulation desselben.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1$ 
Line #2$

Simulieren wir den Befehl mit SED.

[jerry]$ sed 's|$|&$|' test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1$ 
Line #2$

Cat -ET-Befehl

Der Befehl "cat -ET" zeigt das Dollarsymbol ($) am Ende jeder Zeile und die TAB-Zeichen als "^ I" an. Das folgende Beispiel zeigt die Simulation des Befehls "cat -ET" mit SED.

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1^ILine #2$

Simulieren wir den Befehl mit SED.

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1^ILine #2$

nl Befehl

Der Befehl "nl" nummeriert einfach die Zeilen der Dateien. Das folgende SED-Skript simuliert dieses Verhalten.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

1 Line #1 
2 Line #2

Der erste SED-Ausdruck gibt Zeilennummern gefolgt von deren Inhalt aus, und der zweite SED-Ausdruck führt diese beiden Zeilen zusammen und konvertiert Zeilenumbrüche in TAB-Zeichen.

cp Befehl

Der Befehl "cp" erstellt eine weitere Kopie der Datei. Das folgende SED-Skript simuliert dieses Verhalten.

[jerry]$ sed -n 'w dup.txt' data.txt 
[jerry]$ diff data.txt dup.txt 
[jerry]$ echo $?

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

0

Befehl erweitern

Der Befehl "expand" konvertiert TAB-Zeichen in Leerzeichen. Der folgende Code zeigt die Simulation.

[jerry]$ echo -e "One\tTwo\tThree" > test.txt 
[jerry]$ expand test.txt > expand.txt 
[jerry]$ sed 's/\t/     /g' test.txt > new.txt 
[jerry]$ diff new.txt expand.txt  
[jerry]$ echo $?

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

0

Tee-Befehl

Der Befehl "tee" speichert die Daten sowohl im Standardausgabestream als auch in der Datei. Unten ist die Simulation des Befehls "tee" angegeben.

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2

Simulieren wir den Befehl mit SED.

[jerry]$ sed -n 'p; w new.txt' test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1 
Line #2

cat -s Befehl

Der UNIX-Befehl "cat -s" unterdrückt wiederholte leere Ausgabezeilen. Der folgende Code zeigt die Simulation des Befehls "cat -s".

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
[jerry]$ cat -s test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1  
Line #2
Line #3

Simulieren wir den Befehl mit SED.

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1  
Line #2  
Line #3

grep Befehl

Standardmäßig druckt der Befehl "grep" eine Zeile, wenn eine Musterübereinstimmung erfolgreich ist. Der folgende Code zeigt die Simulation.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1

Simulieren wir den Befehl mit SED.

[jerry]$ sed -n '/Line #1/p' test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #1

grep -v Befehl

Standardmäßig druckt der Befehl "grep -v" eine Zeile, wenn eine Musterübereinstimmung fehlschlägt. Der folgende Code zeigt die Simulation.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #2 
Line #3

Simulieren wir den Befehl mit SED.

[jerry]$ sed -n '/Line #1/!p' test.txt

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

Line #2 
Line #3

tr Befehl

Der Befehl "tr" übersetzt Zeichen. Unten ist seine Simulation angegeben.

[jerry]$ echo "ABC" | tr "ABC" "abc"

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

abc

Simulieren wir den Befehl mit SED.

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

Wenn Sie den obigen Code ausführen, erhalten Sie das folgende Ergebnis:

abc