Articles

Linux commando’s leren: sed

Posted on

Welkom bij het tweede deel van onze serie, een deel dat zich zal richten op sed, de GNU versie. Zoals je zult zien, zijn er verschillende varianten van sed, dat beschikbaar is voor nogal wat platformen, maar we zullen ons richten op GNU sed versies 4.x. Velen van jullie hebben al gehoord van sed en hebben het al gebruikt, voornamelijk als een substitutie-tool. Maar dat is slechts een deel van wat sed kan, en we zullen ons best doen om je zo veel mogelijk te laten zien van wat je ermee kunt doen. De naam staat voor Stream EDitor, en “stream” kan hier een bestand, een pipe of gewoon stdin zijn. We verwachten dat je basis Linux kennis hebt en als je al met reguliere expressies hebt gewerkt of op zijn minst weet wat een regexp is, des te beter. We hebben niet de ruimte voor een volledige tutorial over reguliere expressies, dus in plaats daarvan geven we u alleen een basisidee en veel sed voorbeelden. Er zijn veel documenten die over dit onderwerp gaan, en we zullen zelfs enkele aanbevelingen doen, zoals je over een minuut zult zien.

Installatie

Er valt hier niet veel te vertellen, omdat de kans groot is dat je sed al geïnstalleerd hebt, omdat het gebruikt wordt in verschillende systeem scripts en een onschatbaar gereedschap is in het leven van een Linux gebruiker die efficiënt wil zijn. Je kunt testen welke versie je hebt door

 $ sed --version

Op mijn systeem vertelt dit commando me dat ik GNU sed 4.2.1 geïnstalleerd heb, plus links naar de home page en andere nuttige dingen. Het pakket heet gewoon ‘sed’ ongeacht de distributie, maar als Gentoo sed impliciet aanbiedt, betekent dat volgens mij dat je gerust kunt zijn.

Concepten

Voordat we verder gaan, vinden we het belangrijk om aan te geven wat het precies is dat sed doet, omdat “stream editor” misschien niet al te veel belletjes doet rinkelen. sed neemt de ingevoerde tekst, doet de gespecificeerde bewerkingen op elke regel (tenzij anders gespecificeerd) en drukt de gewijzigde tekst af. De gespecificeerde operaties kunnen append, insert, delete of substitute zijn. Dit is niet zo eenvoudig als het lijkt: wees gewaarschuwd dat er een heleboel opties en combinaties zijn die een sed commando nogal moeilijk te verteren kunnen maken. Dus als je sed wilt gebruiken, raden we je aan de basis van regexps te leren, en de rest kun je gaandeweg leren. Voordat we met de tutorial beginnen, willen we Eric Pement en anderen bedanken voor de inspiratie en voor wat hij heeft gedaan voor iedereen die sed wil leren en gebruiken.

Op zoek naar Linux Systeem Analist !
Het UAF Geophysical Institute, is op zoek naar een ervaren Linux Systems Analyst om hun team van research cyber infrastructuur analisten en engineers te versterken. LOCATIE: Fairbanks, Alaska, USA
APPLY NOW

Reguliere uitdrukkingen

Aangezien sed commando’s/scripts de neiging hebben cryptisch te worden, vinden wij dat onze lezers de basisconcepten moeten begrijpen in plaats van blindelings commando’s te kopiëren en te plakken waarvan ze de betekenis niet kennen. Als je wilt begrijpen wat een regexp is, is het sleutelwoord “matching”. Of nog beter, “pattern matching”. Bijvoorbeeld, in een rapport voor uw HR afdeling schreef u de naam van Nick wanneer u verwees naar de netwerk architect. Maar Nick is verhuisd en John is in zijn plaats gekomen, dus nu moet je het woord Nick vervangen door John. Als het bestand report.txt heet, zou je kunnen doen

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

Bestandaard gebruikt sed stdout, dus misschien wil je de redirect operator van je shell gebruiken, zoals in ons voorbeeld hieronder. Dit is een heel eenvoudig voorbeeld, maar we hebben een paar punten geïllustreerd: we komen overeen met het patroon “Nick” en we vervangen alle instanties door “John”. Merk op dat sed hoofdlettergevoelig is, dus wees voorzichtig en controleer je uitvoerbestand om te zien of alle vervangingen zijn uitgevoerd. Het bovenstaande had ook als volgt geschreven kunnen worden:

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

OK, maar waar zijn de reguliere expressies, vraag je je af? Nou, we wilden eerst je voeten nat maken met het concept van matching en hier komt het interessante deel.

Als je niet zeker weet of je per ongeluk “nick” hebt geschreven in plaats van “Nick” en je wilt dat ook matchen, dan zou je sed ‘s/Nick|nick/John/g’ kunnen gebruiken. De verticale balk heeft dezelfde betekenis die je zou kennen als je C zou gebruiken, dat wil zeggen, je expressie zal overeenkomen met Nick of nick. Zoals je zult zien, kan de pipe ook op andere manieren gebruikt worden, maar de betekenis blijft hetzelfde. Andere operatoren die veel gebruikt worden in regexps zijn ‘?’, die overeenkomen met nul of één instantie van het voorgaande element (flavou?r zal overeenkomen met flavor en flavour), ‘*’ betekent nul of meer en ‘+’ komt overeen met één of meer elementen. ^’ komt overeen met het begin van de string, terwijl ‘ Als u een vi(m) gebruiker bent, zullen sommige van deze dingen u misschien bekend voorkomen. Immers, deze utilities, samen met awk of C hebben hun wortels in de begindagen van Unix. We zullen hier niet verder op ingaan, omdat dingen eenvoudiger worden door voorbeelden te lezen, maar wat je moet weten is dat er verschillende implementaties van regexps zijn: POSIX, POSIX Extended, Perl of verschillende implementaties van fuzzy reguliere expressies, waar je gegarandeerd hoofdpijn van krijgt.

sed voorbeelden

Div>

Leren Linux sed commando met voorbeelden
Linux commando syntax Linux commando beschrijving
sed 's/Nick/John/g' report.txt
Vervang elk voorkomen van Nick door John in rapport.txt
sed 's/Nick|nick/John/g' report.txt
Vervang elk voorkomen van Nick of nick door John.
sed 's/^/ /' file.txt >file_new.txt
Voeg 8 spaties toe aan de linkerkant van een tekst voor mooi drukwerk.
sed -n '/Of course/,/attention you \
pay/p' myfile

Er wordt maar één alinea weergegeven, beginnend met “Natuurlijk”

en eindigend met “aandacht die u betaalt”

sed -n 12,18p file.txt
Toon alleen de regels 12-18 van bestand.txt
sed 12,18d file.txt
Toon alles van bestand.txt behalve de regels van 12 tot en met 18
sed G file.txt 
Double-space file.txt
sed -f script.sed file.txt
Schrijf alle commando’s in script.sed en voer ze uit
sed '5!s/ham/cheese/' file.txt
Vervang ham door kaas in bestand.txt behalve in de 5e regel
sed '$d' file.txt
Verwijder de laatste regel
sed '/\{3\}/p' file.txt
Print alleen regels met drie opeenvolgende cijfers
sed '/boom/!s/aaa/bb/' file.txt
Of boom is gevonden vervang aaa door bb
sed '17,/disk/d' file.txt
Verwijder alle regels vanaf regel 17 tot ‘disk’
echo ONE TWO | sed "s/one/unos/I"

Vervangt een met unos op een hoofdletter-ongevoelige manier,

dus het zal “unos TWO”

sed 'G;G' file.txt
Drievoudige-ruimte een bestand
sed 's/.$//' file.txt
Een manier om dos2unix te vervangen 🙂
sed 's/^*//' file.txt
Verwijder alle spaties voor elke regel van bestand.txt
sed 's/*$//' file.txt
Verwijder alle spaties aan het einde van elke regel van het bestand.txt
sed 's/^*//;s/*$//' file.txt

Verwijder alle spaties voor en aan het einde van elke regel

van het bestand.txt

sed 's/foo/bar/' file.txt
Vervang foo door bar alleen voor de eerste instantie in een regel.
sed 's/foo/bar/4' file.txt
Vervang foo door bar alleen voor de 4e instantie in een regel.
sed 's/foo/bar/g' file.txt 
Vervang foo door bar voor alle instanties in een regel.
sed '/baz/s/foo/bar/g' file.txt
Alleen als regel baz bevat, vervang foo door bar
sed '/./,/^$/!d' file.txt
Verwijder alle opeenvolgende lege regels behalve EOF
sed '/^$/N;/\n$/D' file.txt

Alle opeenvolgende lege regels verwijderen, maar staat toe

alleen bovenste lege regel

sed '/./,$!d' file.txt
Verwijder alle voorlopende lege regels
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \
file.txt
Verwijder alle achteraanstaande lege regels
sed -e :a -e '/\$/N; s/\\n//; ta' \
file.txt

Als een bestand eindigt op een backslash, voeg het dan samen met de volgende (handig

voor shell scripts)

sed '/regex/,+5/expr/'
Match regex plus de volgende 5 regels
sed '1~3d' file.txt
Verwijder elke derde regel, te beginnen met de eerste
sed -n '2~5p' file.txt
Print elke 5e regel, te beginnen met de tweede
sed 's/ick/John/g' report.txt

Een andere manier om een voorbeeld hierboven te schrijven.

Kun je raden welke?

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

Print alleen de eerste overeenkomst van

RE (reguliere expressie)

sed '0,/RE/{//d;}' file.txt
Verwijder alleen de eerste overeenkomst
sed '0,/RE/s//to_that/' file.txt
Wijzig alleen de eerste overeenkomst
sed 's/^*,/9999,/' file.csv
Wijzig eerste veld naar 9999 in een CSV-bestand
s/^ *\(.*\) *$/||/;
s/" *, */"|/g;
: loop
s/| *\(*\) *, */||/g;
s/| *, */||/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$//;

sed script om CSV-bestand om te zetten naar balk-gescheiden

(werkt alleen op sommige typen CSV,

met ingesloten “s en komma’s)

sed ':a;s/\(^\|\)\(\+\)\
(\{3\}\)/,/g;ta' file.txt
Verander getallen uit bestand.txt van 1234.56 vormen in 1.234.56
sed -r "s/\<(reg|exp)+/\U&/g"
Omzetten van elk woord dat begint met reg of exp naar hoofdletters
sed '1,20 s/Johnson/White/g' file.txt

Vervang Johnson alleen met Wit op

strepen tussen 1 en 20

sed '1,20 !s/Johnson/White/g' file.txt
Het bovenstaande omgekeerd (kom overeen met alle behalve de regels 1-20)
sed '/from/,/until/ { s/\<red\>/magenta/g; \
s/\<blue\>/cyan/g; }' file.txt
Vervang alleen tussen “van” en “tot”
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \
s/Kraft/Ebbing/g; }' file.txt
Vervang alleen vanaf het woord “ENDNOTES:” tot EOF
sed '/./{H;$!d;};x;/regex/!d' file.txt
Print paragrafen alleen als ze regex
 sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt

Print paragrafen alleen als ze RE1 bevatten,

RE2 en RE3

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

Sluiten twee regels in de eerste eindigt in een backslash

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

Dit is hoe je dubbele aanhalingstekens kunt gebruiken

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

Werken met Unix paden

 sed 's///g' file.txt

Verwijder alle karakters van a tot g uit bestand.txt

sed 's/\(.*\)foo/bar/' file.txt
Vervang alleen de laatste overeenkomst van foo met bar
sed '1!G;h;$!d' 
Een tac vervanger
sed '/\n/!G;s/\(.\)\(.*\n\)/&\
/;//D;s/.//'
Een rev vervanger
sed 10q file.txt
Een kopvervanger
sed -e :a -e '$q;N;11,$D;ba' \
file.txt
Een staartvervanger
sed '$!N; /^\(.*\)\n$/!P; D' \
file.txt
Een uniq-vervanger
sed '$!N; s/^\(.*\)\n$//;\
t; D' file.txt
Het tegenovergestelde (of uniq -d equivalent)
sed '$!N;$!D' file.txt
Equivalent aan staart -n 2
sed -n '$p' file.txt
… tail -n 1 (of tail -1)
sed '/regexp/!d' file.txt
grep equivalent
sed -n '/regexp/{g;1!p;};h' file.txt

Print de regel vóór de regel die overeenkomt met regexp, maar

niet degene die de regexp bevat

sed -n '/regexp/{n;p;}' file.txt
Print de regel na degene die overeenkomt met de regexp, maar

niet degene die de regexp bevat

sed '/pattern/d' file.txt
Verwijder regels die overeenkomen met het patroon
sed '/./!d' file.txt
Verwijder alle lege regels uit een bestand
sed '/^$/N;/\n$/N;//D' file.txt

Alle opeenvolgende lege regels verwijderen

uitgezonderd de eerste twee

sed -n '/^$/{p;h;};/./{x;/./p;}'\
file.txt
Verwijder de laatste regel van elke alinea
sed 's/.\x08//g' file
Verwijder nroff overstakingen
sed '/^$/q'
Get mail header
sed '1,/^$/d'
Get mail body
sed '/^Subject: */!d; s///;q'
Ontvang onderwerp mail
sed 's/^/> /'

Vraag mailbericht op door een

“> ” voor elke regel

sed 's/^> //'
Het tegenovergestelde (unquote mailbericht)
sed -e :a -e 's/<*>//g;/</N;//ba'
Verwijder HTML-tags
sed '/./{H;d;};x;s/\n/={NL}=/g'\
file.txt | sort \
| sed '1s/={NL}=//;s/={NL}=/\n/g'
Sorteer paragrafen van file.txt alfabetisch
sed 's@/usr/bin@&/local@g' path.txt
Vervang /usr/bin door /usr/bin/local in path.txt
sed 's@^.*$@<<<&>>>@g' path.txt
Probeer het en zie 🙂
sed 's/\(\/*\).*//g' path.txt

Gegeven pad.txt bevat $PATH, dan

echoën we alleen het eerste pad op elke regel

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

awk replacement – geeft alleen de gebruikers weer

uit het passwd-bestand

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

Verwissel ‘heuvels’ voor ‘bergen’, maar alleen op blokken

tekst die

beginnen met een lege regel, en eindigen met een regel die

begint met de drie tekens ‘EINDE’, inclusief

sed -e '/^#/d' /etc/services | more
Bekijk het services bestand zonder de becommentarieerde regels
sed '$s@\(*\):\(*\):\(*\
\)@::@g' path.txt
Reverseer de volgorde van items in de laatste regel van path.txt
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\
-e h file.txt

Print 1 regel van context voor en na de regel die overeenkomt,

met een regelnummer waar de matching plaatsvindt

sed '/regex/{x;p;x;}' bestand.txt
Voeg een nieuwe regel in boven elke regel die overeenkomt met regex
sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt
Match AAA, BBB en CCC in die volgorde
sed '/AAA.*BBB.*CCC/!d' file.txt
Match AAA, BBB en CCC in die volgorde
sed -n '/^.\{65\}/p' file.txt
Print regels die 65 karakters of meer lang zijn
sed -n '/^.\{65\}/!p' file.txt
Regels afdrukken van 65 karakters lang of minder
sed '/regex/G' bestand.txt
Voeg lege regel in onder elke regel
s '/regex/{x;p;x;G;}' bestand.txt
Voeg lege regel in boven en onder
sed = bestand.txt | sed 'N;s/\n/'
Aantal regels in bestand.txt
sed -e :a -e 's/^.\{1,78\}$/\
&/;ta' bestand.txt
Tekst vlak rechts uitlijnen
sed -e :a -e 's/^.\{{1,77}$/ &/;ta' -e \
's/{ *})//' file.txt
Tekst centreren

Conclusie

Dit is slechts een deel van wat er over sed verteld kan worden, maar deze serie is bedoeld als een praktische gids, dus we hopen dat het je helpt de kracht van Unix tools te ontdekken en efficiënter te worden in je werk.

het tegenovergestelde doet. 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *