Articles

Linux-Befehle lernen: sed

Posted on

Willkommen zum zweiten Teil unserer Serie, einem Teil, der sich auf sed, die GNU-Version, konzentrieren wird. Wie Sie sehen werden, gibt es mehrere Varianten von sed, das für eine ganze Reihe von Plattformen verfügbar ist, aber wir werden uns auf die GNU sed-Versionen 4.x konzentrieren. Viele von Ihnen haben schon von sed gehört und es auch schon benutzt, hauptsächlich als Ersetzungswerkzeug. Aber das ist nur ein Ausschnitt dessen, was sed kann, und wir werden unser Bestes tun, um Ihnen so viel wie möglich von dem zu zeigen, was Sie damit machen können. Der Name steht für Stream EDitor, und „Stream“ kann hier eine Datei, eine Pipe oder einfach stdin sein. Wir erwarten, dass Sie grundlegende Linux-Kenntnisse haben, und wenn Sie bereits mit regulären Ausdrücken gearbeitet haben oder zumindest wissen, was ein regexp ist, umso besser. Wir haben nicht den Platz für ein komplettes Tutorial über reguläre Ausdrücke, also werden wir Ihnen stattdessen nur eine grundlegende Idee und viele sed-Beispiele geben. Es gibt viele Dokumente, die sich mit dem Thema beschäftigen, und wir haben sogar einige Empfehlungen, wie Sie gleich sehen werden.

Installation

Es gibt hier nicht viel zu erzählen, denn die Chancen stehen gut, dass Sie sed bereits installiert haben, da es in verschiedenen System-Skripten verwendet wird und ein unschätzbares Werkzeug im Leben eines Linux-Benutzers ist, der effizient sein will. Sie können testen, welche Version Sie haben, indem Sie

 $ sed --version

Auf meinem System sagt mir dieser Befehl, dass ich GNU sed 4.2.1 installiert habe, plus Links zur Homepage und anderen nützlichen Dingen. Das Paket heißt einfach ’sed‘, unabhängig von der Distribution, aber wenn Gentoo sed implizit anbietet, können Sie sich darauf verlassen.

Konzepte

Bevor wir weitermachen, ist es wichtig, darauf hinzuweisen, was genau sed macht, denn bei „Stream-Editor“ klingeln vielleicht nicht allzu viele Glocken. sed nimmt den Eingabetext, führt die angegebenen Operationen in jeder Zeile aus (sofern nicht anders angegeben) und gibt den veränderten Text aus. Die angegebenen Operationen können anhängen, einfügen, löschen oder ersetzen sein. Das ist nicht so einfach, wie es vielleicht aussieht: Seien Sie gewarnt, dass es eine Menge Optionen und Kombinationen gibt, die einen sed-Befehl ziemlich schwer verdaulich machen können. Wenn Sie sed also benutzen wollen, empfehlen wir Ihnen, die Grundlagen von regexps zu lernen, und den Rest können Sie sich nach und nach aneignen. Bevor wir mit dem Tutorial beginnen, möchten wir Eric Pement und anderen für die Inspiration danken und für das, was er für alle getan hat, die sed lernen und benutzen wollen.

Linux Systems Analyst gesucht!
Das UAF Geophysical Institute, sucht einen erfahrenen Linux Systems Analysten zur Verstärkung des Teams von Analysten und Ingenieuren für die Forschungs-Cyberinfrastruktur. STANDORT: Fairbanks, Alaska, USA
JETZT BEWERBEN

Reguläre Ausdrücke

Da sed-Befehle/Skripte dazu neigen, kryptisch zu werden, sind wir der Meinung, dass unsere Leser die grundlegenden Konzepte verstehen müssen, anstatt blindlings Befehle zu kopieren und einzufügen, deren Bedeutung sie nicht kennen. Wenn man verstehen will, was eine regexp ist, ist das Schlüsselwort „matching“. Oder noch besser: „Mustervergleich“. Ein Beispiel: In einem Bericht für Ihre Personalabteilung haben Sie den Namen Nick geschrieben, wenn es um den Netzwerkarchitekten ging. Aber Nick ist weitergezogen und John hat seinen Platz eingenommen, also müssen Sie jetzt das Wort Nick durch John ersetzen. Wenn die Datei report.txt heißt, könnten Sie so vorgehen

 $ cat report.txt | sed 's/Nick/John/g' > report_new.txt

Standardmäßig verwendet sed stdout, also sollten Sie den Umleitungsoperator Ihrer Shell verwenden, wie in unserem Beispiel unten. Dies ist ein sehr einfaches Beispiel, aber wir haben ein paar Punkte illustriert: Wir suchen nach dem Muster „Nick“ und ersetzen alle Instanzen durch „John“. Beachten Sie, dass sed zwischen Groß- und Kleinschreibung unterscheidet, seien Sie also vorsichtig und überprüfen Sie Ihre Ausgabedatei, um zu sehen, ob alle Ersetzungen vorgenommen wurden. Das obige hätte auch so geschrieben werden können:

 $ sed 's/Nick/John/g' report.txt > report_new.txt

OK, aber wo sind die regulären Ausdrücke, fragen Sie? Nun, wir wollten Sie erst einmal mit dem Konzept des Abgleichs vertraut machen und hier kommt der interessante Teil.

Wenn Sie sich nicht sicher sind, ob Sie versehentlich „nick“ statt „Nick“ geschrieben haben und auch das abgleichen wollen, könnten Sie sed ’s/Nick|nick/John/g‘ verwenden. Der vertikale Balken hat dieselbe Bedeutung, die Sie vielleicht kennen, wenn Sie C verwenden, nämlich, dass Ihr Ausdruck auf Nick oder nick passt. Wie Sie sehen werden, kann die Pipe auch auf andere Weise verwendet werden, aber ihre Bedeutung bleibt erhalten. Andere in Regexps häufig verwendete Operatoren sind ‚?‘, die auf null oder eine Instanz des vorangehenden Elements passen (flavou?r passt auf flavor und flavour), ‚*‘ bedeutet null oder mehr und ‚+‘ passt auf ein oder mehrere Elemente. ‚^‘ passt auf den Anfang der Zeichenkette, während ‚ Wenn Sie ein vi(m)-Benutzer sind, kommen Ihnen einige dieser Dinge vielleicht bekannt vor. Schließlich haben diese Hilfsprogramme, zusammen mit awk oder C, ihre Wurzeln in den frühen Tagen von Unix. Wir werden nicht weiter auf das Thema eingehen, da die Dinge durch das Lesen von Beispielen einfacher werden, aber was Sie wissen sollten, ist, dass es verschiedene Implementierungen von regexps gibt: POSIX, POSIX Extended, Perl oder verschiedene Implementierungen von unscharfen regulären Ausdrücken, die Ihnen garantiert Kopfschmerzen bereiten werden.

sed-Beispiele

Lernen des Linux-Befehls sed mit Beispielen
Linux-Befehlssyntax Linux-Befehlsbeschreibung
sed 's/Nick/John/g' report.txt
Ersetzen Sie jedes Vorkommen von Nick durch John im Bericht.txt
sed 's/Nick|nick/John/g' report.txt
Ersetzen Sie jedes Vorkommen von Nick oder nick durch John.
sed 's/^/ /' file.txt >file_new.txt
Hinzufügen von 8 Leerzeichen links vom Text für einen schönen Druck.
sed -n '/Of course/,/attention you \
pay/p' myfile

Nur einen Absatz anzeigen, beginnend mit „Natürlich“

und endend mit „Achtung Sie zahlen“

sed -n 12,18p file.txt
Zeige nur die Zeilen 12-18 der Datei.txt
sed 12,18d file.txt
Gesamtes von Datei anzeigen.txt mit Ausnahme der Zeilen 12 bis 18
sed G file.txt 
Doppelte Leerzeichen in Datei.txt
sed -f script.sed file.txt
Alle Befehle in script.sed und führen Sie sie aus
sed '5!s/ham/cheese/' file.txt
Ersetzen Sie Schinken durch Käse in file.txt außer in der 5. Zeile
sed '$d' file.txt
Lösche die letzte Zeile
sed '/\{3\}/p' file.txt
Nur Zeilen mit drei aufeinanderfolgenden Ziffern drucken
sed '/boom/!s/aaa/bb/' file.txt
Wenn kein Boom gefunden wird, aaa durch bb ersetzen
sed '17,/disk/d' file.txt
Löschen alle Zeilen von Zeile 17 bis ‚disk‘
echo ONE TWO | sed "s/one/unos/I"

Ersetzt eins mit unos in einer Groß- und Kleinschreibunginsensitive manner,

So wird „unos TWO“

sed 'G;G' file.txt
Dreifach-Space eine Datei
sed 's/.$//' file.txt
Eine Möglichkeit, dos2unix zu ersetzen 🙂
sed 's/^*//' file.txt
Löschen Sie alle Leerzeichen vor jeder Zeile der Datei.txt
sed 's/*$//' file.txt
Löschen Sie alle Leerzeichen am Ende jeder Zeile der Datei.txt
sed 's/^*//;s/*$//' file.txt

Lösche alle Leerzeichen vor und am Ende jeder Zeile

der Datei.txt

sed 's/foo/bar/' file.txt
Ersetzen Sie foo durch bar nur bei der ersten Instanz in einer Zeile.
sed 's/foo/bar/4' file.txt
Ersetzen Sie foo durch bar nur bei der vierten Instanz in einer Zeile.
sed 's/foo/bar/g' file.txt 
Ersetzen Sie foo durch bar für alle Instanzen in einer Zeile.
sed '/baz/s/foo/bar/g' file.txt
Nur wenn Zeile baz enthält, foo durch bar ersetzen
sed '/./,/^$/!d' file.txt
Alle aufeinanderfolgenden Leerzeilen löschen Zeilen außer EOF
sed '/^$/N;/\n$/D' file.txt

Lösche alle aufeinanderfolgenden Leerzeilen, aber erlaubt

nur obere Leerzeile

sed '/./,$!d' file.txt
Alle führenden Leerzeilen löschen
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \
file.txt
Alle nachgestellten Leerzeilen löschen
sed -e :a -e '/\$/N; s/\\n//; ta' \
file.txt

Wenn eine Datei mit einem Backslash endet, mit dem nächsten verbinden (nützlich

für Shell-Skripte)

sed '/regex/,+5/expr/'
Match regex plus die nächsten 5 Zeilen
sed '1~3d' file.txt
Lösche jede dritte Zeile, beginnend mit der ersten
sed -n '2~5p' file.txt
Drucke jede fünfte Zeile beginnend mit der zweiten
sed 's/ick/John/g' report.txt

Eine andere Art, ein Beispiel oben zu schreiben.

Können Sie erraten, welche?

sed -n '/RE/{p;q;}' file.txt

Drucke nur die erste Übereinstimmung von

RE (regulärer Ausdruck)

sed '0,/RE/{//d;}' file.txt
Nur den ersten Treffer löschen
sed '0,/RE/s//to_that/' file.txt
Nur den ersten Treffer ändern
sed 's/^*,/9999,/' file.csv
Ändern erstes Feld in einer CSV-Datei auf 9999
s/^ *\(.*\) *$/||/;
s/" *, */"|/g;
: loop
s/| *\(*\) *, */||/g;
s/| *, */||/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$//;

sed script to convert CSV file to bar-getrennt

(funktioniert nur bei einigen Typen von CSV,

mit eingebetteten „s und Kommas)

sed ':a;s/\(^\|\)\(\+\)\
(\{3\}\)/,/g;ta' file.txt
Ändern Sie Zahlen aus Datei.txt von 1234.56 form in 1.234.56
sed -r "s/\<(reg|exp)+/\U&/g"
Konvertiere jedes Wort, das mit reg oder exp beginnt, in Großbuchstaben
sed '1,20 s/Johnson/White/g' file.txt

Ersetzen Sie Johnson durch Weiß nur auf

Zeilen zwischen 1 und 20

sed '1,20 !s/Johnson/White/g' file.txt
Das obige umgekehrt (alle außer Zeilen 1-20)
sed '/from/,/until/ { s/\<red\>/magenta/g; \
s/\<blue\>/cyan/g; }' file.txt
Ersetzen Sie nur zwischen „von“ und „bis“
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \
s/Kraft/Ebbing/g; }' file.txt
Ersetzen Sie nur ab dem Wort „ENDNOTES:“ bis EOF
sed '/./{H;$!d;};x;/regex/!d' file.txt
Drucke Absätze nur, wenn sie enthalten regex
 sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt
Drucke Absätze nur, wenn sie RE1 enthalten,

RE2 und RE3

 sed ':a; /\$/N; s/\\n//; ta' file.txt

Zwei Zeilen werden in der ersten endet mit einem Backslash

 sed 's/14"/fourteen inches/g' file.txt

So können Sie doppelte Anführungszeichen verwenden können

 sed 's/\/some\/UNIX\/path/\/a\/new\
/path/g' file.txt

Arbeiten mit Unix Pfaden

 sed 's///g' file.txt

Entfernen aller Zeichen von a bis g aus Datei.txt

sed 's/\(.*\)foo/bar/' file.txt
Ersetzen nur die letzte Übereinstimmung von foo mit bar
sed '1!G;h;$!d' 
Ein Tac-Ersatz
sed '/\n/!G;s/\(.\)\(.*\n\)/&\
/;//D;s/.//'
Ein rev-Ersatz
sed 10q file.txt
Ein Kopfersatz
sed -e :a -e '$q;N;11,$D;ba' \
file.txt
Ein Heckersatz
sed '$!N; /^\(.*\)\n$/!P; D' \
file.txt
Ein uniq-Ersatz
sed '$!N; s/^\(.*\)\n$//;\
t; D' file.txt
Das Gegenteil (oder uniq -d äquivalent)
sed '$!N;$!D' file.txt
Äquivalent zu tail -n 2
sed -n '$p' file.txt
… tail -n 1 (oder tail -1)
sed '/regexp/!d' file.txt
grep-Äquivalent
sed -n '/regexp/{g;1!p;};h' file.txt

Drucke die Zeile vor der, die mit regexp übereinstimmt, aber

nicht die, die den regexp enthält

sed -n '/regexp/{n;p;}' file.txt
Drucke die Zeile nach derjenigen, die mit dem regexp, aber

nicht die, die den regexp enthält

sed '/pattern/d' file.txt
Lösche Zeilen, die dem Muster entsprechen
sed '/./!d' file.txt
Lösche alle Leerzeilen aus einer Datei
sed '/^$/N;/\n$/N;//D' file.txt

Löschen Sie alle aufeinanderfolgenden Leerzeilen

Ausgenommen die ersten beiden

sed -n '/^$/{p;h;};/./{x;/./p;}'\
file.txt
Löschen Sie die letzte Zeile eines jeden Absatzes
sed 's/.\x08//g' file
Entfernen nroff-Überstriche
sed '/^$/q'
Mail-Kopfzeile holen
sed '1,/^$/d'
Mailkörper holen
sed '/^Subject: */!d; s///;q'
Mail-Betreff abrufen
sed 's/^/> /'

Mail-Nachricht zitieren durch Einfügen eines

„> “ vor jeder Zeile

sed 's/^> //'
Das Gegenteil (nicht zitierte Mailnachricht)
sed -e :a -e 's/<*>//g;/</N;//ba'
Entfernen der HTML-Tags
sed '/./{H;d;};x;s/\n/={NL}=/g'\
file.txt | sort \
| sed '1s/={NL}=//;s/={NL}=/\n/g'
Absätze der Datei sortieren.txt alphabetisch sortieren
sed 's@/usr/bin@&/local@g' path.txt
Ersetzen Sie /usr/bin durch /usr/bin/local in Pfad.txt
sed 's@^.*$@<<<&>>>@g' path.txt
Versuchen Sie es und sehen Sie 🙂
sed 's/\(\/*\).*//g' path.txt

Gebotener Pfad.txt enthält $PATH, wird dies

nur den ersten Pfad in jeder Zeile ausgeben

sed 's/\(*\).*//' /etc/passwd

Ersatz vonawk – zeigt nur die Benutzer

aus der passwd-Datei

echo "Welcome To The Geek Stuff" | sed \
's/\(\b\)/\(\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff
Selbst-erklärend
sed -e '/^$/,/^END/s/hills/\
mountains/g' file.txt

Tausche ‚Hügel‘ gegen ‚Berge‘, aber nur bei Blöcken

von Text, der

mit einer Leerzeile beginnt und mit einer Zeile endet, die

mit den drei Zeichen ‚END‘ beginnt, inklusive

sed -e '/^#/d' /etc/services | more
Ansicht der Service-Datei ohne die kommentierten Zeilen
sed '$s@\(*\):\(*\):\(*\
\)@::@g' path.txt
Umgekehrte Reihenfolge der Elemente in der letzten Zeile von path.txt
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\
-e h file.txt

Drucken Sie 1 Zeile Kontext vor und nach der passenden Zeile,

mit einer Zeilennummer, in der der Abgleich stattfindet

sed '/regex/{x;p;x;}' file.txt
Einfügen einer neuen Zeile über jeder mit regex übereinstimmenden Zeile
sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt
Match AAA, BBB und CCC in beliebiger Reihenfolge
sed '/AAA.*BBB.*CCC/!d' file.txt
Match AAA, BBB und CCC in dieser Reihenfolge
sed -n '/^.\{65\}/p' file.txt
Drucke Zeilen mit 65 Zeichen oder mehr
sed -n '/^.\{65\}/!p' file.txt
Drucke Zeilen mit 65 Zeichen lang oder kürzer
sed '/regex/G' file.txt
Leerzeile unter jeder Zeile einfügen
sed '/regex/{x;p;x;G;}' file.txt
Leerzeile oben und unten einfügen
sed = file.txt | sed 'N;s/\n/\t/'
Zeilenanzahl in file.txt
sed -e :a -e 's/^.\{1,78\}$/\
&/;ta' file.txt
Text rechtsbündig ausrichten
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e \
's/\( *\)//' file.txt
Text zentriert ausrichten

Abschluss

Das ist nur ein Teil dessen, was man über sed erzählen kann, aber diese Serie ist als praktischer Leitfaden gedacht, und wir hoffen, dass sie Ihnen hilft, die Macht der Unix-Werkzeuge zu entdecken und effizienter in Ihrer Arbeit zu werden.

das Gegenteil bewirkt. If you’re a vi(m) user, some of these things might look familiar. After all, these utilities, together with awk or C have their roots in the early days of Unix. We won’t insist anymore on the subject, as things will become simpler by reading examples, but what you should know is that there are various implementations of regexps: POSIX, POSIX Extended, Perl or various implementations of fuzzy regular expressions, guaranteed to give you a headache.

sed examples

Learning Linux sed command with examples
Linux command syntax Linux command description
sed 's/Nick/John/g' report.txt
Replace every occurrence of Nick with John in report.txt
sed 's/Nick|nick/John/g' report.txt
Replace every occurrence of Nick or nick with John.
sed 's/^/ /' file.txt >file_new.txt
Add 8 spaces to the left of a text for pretty printing.
sed -n '/Of course/,/attention you \
pay/p' myfile

Display only one paragraph, starting with „Of course“

and ending in „attention you pay“

sed -n 12,18p file.txt
Show only lines 12-18 of file.txt
sed 12,18d file.txt
Show all of file.txt except for lines from 12 to 18
sed G file.txt 
Double-space file.txt
sed -f script.sed file.txt
Write all commands in script.sed and execute them
sed '5!s/ham/cheese/' file.txt
Replace ham with cheese in file.txt except in the 5th line
sed '$d' file.txt
Delete the last line
sed '/\{3\}/p' file.txt
Print only lines with three consecutive digits
sed '/boom/!s/aaa/bb/' file.txt
Unless boom is found replace aaa with bb
sed '17,/disk/d' file.txt
Delete all lines from line 17 to ‚disk‘
echo ONE TWO | sed "s/one/unos/I"

Replaces one with unos in a case-insensitive manner,

so it will print „unos TWO“

sed 'G;G' file.txt
Triple-space a file
sed 's/.$//' file.txt
A way to replace dos2unix 🙂
sed 's/^*//' file.txt
Delete all spaces in front of every line of file.txt
sed 's/*$//' file.txt
Delete all spaces at the end of every line of file.txt
sed 's/^*//;s/*$//' file.txt

Delete all spaces in front and at the end of every line

of file.txt

sed 's/foo/bar/' file.txt
Replace foo with bar only for the first instance in a line.
sed 's/foo/bar/4' file.txt
Replace foo with bar only for the 4th instance in a line.
sed 's/foo/bar/g' file.txt 
Replace foo with bar for all instances in a line.
sed '/baz/s/foo/bar/g' file.txt
Only if line contains baz, substitute foo with bar
sed '/./,/^$/!d' file.txt
Delete all consecutive blank lines except for EOF
sed '/^$/N;/\n$/D' file.txt

Delete all consecutive blank lines, but allows

only top blank line

sed '/./,$!d' file.txt
Delete all leading blank lines
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \
file.txt
Delete all trailing blank lines
sed -e :a -e '/\$/N; s/\\n//; ta' \
file.txt

If a file ends in a backslash, join it with the next (useful

for shell scripts)

sed '/regex/,+5/expr/'
Match regex plus the next 5 lines
sed '1~3d' file.txt
Delete every third line, starting with the first
sed -n '2~5p' file.txt
Print every 5th line starting with the second
sed 's/ick/John/g' report.txt

Another way to write some example above.

Can you guess which one?

sed -n '/RE/{p;q;}' file.txt

Print only the first match of

RE (regular expression)

sed '0,/RE/{//d;}' file.txt
Delete only the first match
sed '0,/RE/s//to_that/' file.txt
Change only the first match
sed 's/^*,/9999,/' file.csv
Change first field to 9999 in a CSV file
s/^ *\(.*\) *$/||/;
s/" *, */"|/g;
: loop
s/| *\(*\) *, */||/g;
s/| *, */||/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$//;

sed script to convert CSV file to bar-separated

(works only on some types of CSV,

with embedded „s and commas)

sed ':a;s/\(^\|\)\(\+\)\
(\{3\}\)/,/g;ta' file.txt
Change numbers from file.txt from 1234.56 form to 1.234.56
sed -r "s/\<(reg|exp)+/\U&/g"
Convert any word starting with reg or exp to uppercase
sed '1,20 s/Johnson/White/g' file.txt

Do replacement of Johnson with White only on

lines between 1 and 20

sed '1,20 !s/Johnson/White/g' file.txt
The above reversed (match all except lines 1-20)
sed '/from/,/until/ { s/\<red\>/magenta/g; \
s/\<blue\>/cyan/g; }' file.txt
Replace only between „from“ and „until“
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \
s/Kraft/Ebbing/g; }' file.txt
Replace only from the word „ENDNOTES:“ until EOF
sed '/./{H;$!d;};x;/regex/!d' file.txt
Print paragraphs only if they contain regex
 sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt

Print paragraphs only if they contain RE1,

RE2 and RE3

 sed ':a; /\$/N; s/\\n//; ta' file.txt

Join two lines in the first ends in a backslash

 sed 's/14"/fourteen inches/g' file.txt

This is how you can use double quotes

 sed 's/\/some\/UNIX\/path/\/a\/new\
/path/g' file.txt

Working with Unix paths

 sed 's///g' file.txt

Remove all characters from a to g from file.txt

sed 's/\(.*\)foo/bar/' file.txt
Replace only the last match of foo with bar
sed '1!G;h;$!d' 
A tac replacement
sed '/\n/!G;s/\(.\)\(.*\n\)/&\
/;//D;s/.//'
A rev replacement
sed 10q file.txt
A head replacement
sed -e :a -e '$q;N;11,$D;ba' \
file.txt
A tail replacement
sed '$!N; /^\(.*\)\n$/!P; D' \
file.txt
A uniq replacement
sed '$!N; s/^\(.*\)\n$//;\
t; D' file.txt
The opposite (or uniq -d equivalent)
sed '$!N;$!D' file.txt
Equivalent to tail -n 2
sed -n '$p' file.txt
… tail -n 1 (or tail -1)
sed '/regexp/!d' file.txt
grep equivalent
sed -n '/regexp/{g;1!p;};h' file.txt

Print the line before the one matching regexp, but

not the one containing the regexp

sed -n '/regexp/{n;p;}' file.txt
Print the line after the one matching the regexp, but

not the one containing the regexp

sed '/pattern/d' file.txt
Delete lines matching pattern
sed '/./!d' file.txt
Delete all blank lines from a file
sed '/^$/N;/\n$/N;//D' file.txt

Delete all consecutive blank lines

except for the first two

sed -n '/^$/{p;h;};/./{x;/./p;}'\
file.txt
Delete the last line of each paragraph
sed 's/.\x08//g' file
Remove nroff overstrikes
sed '/^$/q'
Get mail header
sed '1,/^$/d'
Get mail body
sed '/^Subject: */!d; s///;q'
Get mail subject
sed 's/^/> /'

Quote mail message by inserting a

„> “ in front of every line

sed 's/^> //'
The opposite (unquote mail message)
sed -e :a -e 's/<*>//g;/</N;//ba'
Remove HTML tags
sed '/./{H;d;};x;s/\n/={NL}=/g'\
file.txt | sort \
| sed '1s/={NL}=//;s/={NL}=/\n/g'
Sort paragraphs of file.txt alphabetically
sed 's@/usr/bin@&/local@g' path.txt
Replace /usr/bin with /usr/bin/local in path.txt
sed 's@^.*$@<<<&>>>@g' path.txt
Try it and see 🙂
sed 's/\(\/*\).*//g' path.txt

Provided path.txt contains $PATH, this will

echo only the first path on each line

sed 's/\(*\).*//' /etc/passwd

awk replacement – displays only the users

from the passwd file

echo "Welcome To The Geek Stuff" | sed \
's/\(\b\)/\(\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff
Self-explanatory
sed -e '/^$/,/^END/s/hills/\
mountains/g' file.txt

Swap ‚hills‘ for ‚mountains‘, but only on blocks

of text beginning

with a blank line, and ending with a line beginning

with the three characters ‚END‘, inclusive

sed -e '/^#/d' /etc/services | more
View the services file without the commented lines
sed '$s@\(*\):\(*\):\(*\
\)@::@g' path.txt
Reverse order of items in the last line of path.txt
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\
-e h file.txt

Print 1 line of context before and after the line matching,

with a line number where the matching occurs

sed '/regex/{x;p;x;}' file.txt
Insert a new line above every line matching regex
sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt
Match AAA, BBB and CCC in any order
sed '/AAA.*BBB.*CCC/!d' file.txt
Match AAA, BBB and CCC in that order
sed -n '/^.\{65\}/p' file.txt
Print lines 65 chars long or more
sed -n '/^.\{65\}/!p' file.txt
Print lines 65 chars long or less
sed '/regex/G' file.txt
Insert blank line below every line
sed '/regex/{x;p;x;G;}' file.txt
Insert blank line above and below
sed = file.txt | sed 'N;s/\n/\t/'
Number lines in file.txt
sed -e :a -e 's/^.\{1,78\}$/\
&/;ta' file.txt
Align text flush right
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e \
's/\( *\)//' file.txt
Align text center

Conclusion

This is only a part of what can be told about sed, but this series is meant as a practical guide, so we hope it helps you discover the power of Unix tools and become more efficient in your work.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.