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