Tips en Trucs 2013

SED (Stream EDitor)

Inleiding:

Sed kan:

Voorbeelden

Zoeken en vervangen (s)

De syntaxis:

sed 's/zoekterm/vervangterm/' bestand

-Of-

cat bestand | sed 's/zoekterm/vervangterm/'

-Of-

echo "Dit is een test bericht" | sed 's/zoekterm/vervangterm/'

Zoek in het bestand test.txt naar het woord google en vervang dit woord door yahoo

sed 's/google/yahoo/' test.txt

Standaard wordt enkel het eerste voorkomen van het zoekwoord vervangen, wat als we alle zoekwoorden willen vervangen.

dany@linux-e1kr:~> echo "Sheena wil, Sheila krijgt" | sed 's/Sh/L/'
Leena wil, Leila krijgt

Om globaal (meerdere termen) te zoeken en te vervangen, gebruik je de g optie:

dany@linux-e1kr:~> echo "Sheena wil, Sheila krijgt" | sed 's/Sh/L/g'
Leena wil, Leila krijgt

Wat als het scheidingsteken in de zoek- of vervangterm voorkomt? Dan gebruiken we gewoon een ander scheidingsteken. Om de term /var/ftp/pub te vervangen door /opt/ftp/com gebruiken we als scheidingsteken _:

sed 's_/var/ftp/pup_/opt/ftp/com_' test.txt

Sed slaat de zoekterm op in een variabele met de naam &, waardoor je deze in de vervangterm kunt hergebruiken. We zoeken naar de term Surendra en vervangen die door Dhr. Surendra.

sed 's/Surendra/Dhr. &/' test.txt

Het volgende voorbeeld gebruikt reguliere expressies (complex, maar krachtig en stof voor een andere tip) waardoor sed enorm krachtig wordt. Om abc123suri om te vormen naar suriabc123, gebruik je:

echo "abc123suri" | sed 's/\([a-z]*\)\([0-9]*\)\([a-z]*\)/\3\1\2/'

Daarbij bevat \1 het resultaat (abc) van de eerste reguliere expressie ([a-z]*), \2 van de tweede reguliere expressie ([0-9]*), \3 van de derde reguliere expressie.

Weergeven (-n en p optie)

Sed geeft standaard alle regels weer. Soms wil je alleen de aangepaste regels zien. Daarvoor gebruiken we de -n optie om de uitvoer uit te schakelen en p om de aangepaste regels weer te geven. Voor de voorbeelden, maken we het volgende bestand aan:

dany@linux-e1kr:~> echo "surendra audi" > tem.txt
dany@linux-e1kr:~> echo "kumar nudi" >> tem.txt
dany@linux-e1kr:~> echo "mouni surendra" >> tem.txt
dany@linux-e1kr:~> echo "baby dudy" >> tem.tx
dany@linux-e1kr:~> cat tem.txt
surendra audi
kumar nudi
mouni surendra
baby dudy

Het voorbeeld:

dany@linux-e1kr:~> cat tem.txt | sed 's/surendra/bca/'
bca audi
kumar nudi
mouni bca
baby dudy

Met -n (uitvoer onderdrukken) en p (gevonden patronen weergeven):

dany@linux-e1kr:~> cat tem.txt | sed -n 's/surendra/bca/p'
bca audi
mouni bca

Bewerken (-i, w, d optie en shell redirection)

Om een bestand aan te passen, gebruiken we de -i optie (insert). Gebruik de -i doordacht, er is namelijk geen manier om het originele bestand te herstellen.

dany@linux-e1kr:~> sed -i 's/surendra/bca/' tem.txt
dany@linux-e1kr:~> cat tem.txt
bca audi
kumar nudi
mouni bca
baby dudy
dany@linux-e1kr:~> sed -i 's/bca/surendra/' tem.txt
dany@linux-e1kr:~> cat tem.txt
surendra audi
kumar nudi
mouni surendra
baby dudy

Met uitvoer redirection kunnen we hetzelfde bereiken:

dany@linux-e1kr:~> sed 's/surendra/bca/' < tem.txt > abc.txt
dany@linux-e1kr:~> cat abc.txt
bca audi
kumar nudi
mouni bca
baby dudy

Om enkel de aanpassingen naar een bestand te schrijven:

dany@linux-e1kr:~> sed 's/surendra/bca/w abc.txt' tem.txt
bca audi
kumar nudi
mouni bca
baby dudy
dany@linux-e1kr:~> cat abc.txt
bca audi
mouni bca

Om de derde regel te verwijderen:

dany@linux-e1kr:~> sed '3d' tem.txt
surendra audi
kumar nudi
baby dudy

Om de vierde regel in het bestand te verwijderen:

dany@linux-e1kr:~> sed -i '4d' tem.txt
dany@linux-e1kr:~> cat tem.txt
surendra audi
kumar nudi
mouni surendra

Meerdere sed opdrachten en verder bewerken (-e en ; optie)

Soms moet je verschillende termen zoeken en vervangen. Daarvoor kan je een klassieke ketting van opdrachten gebruiken:

dany@linux-e1kr:~> cat tem.txt | sed 's/surendra/bca/' | sed 's/mouni/mca/' | sed 's/baby/bba/'
bca audi
kumar nudi
mca bca

Dit wordt met de -e optie:

dany@linux-e1kr:~> sed -e 's/surendra/bca/' -e 's/mouni/mca/' -e 's/baby/bba/' tem.txt
bca audi
kumar nudi
mca bca

En nog korter met:

dany@linux-e1kr:~> sed 's/surendra/bca/;s/mouni/mca/;s/baby/bba/' tem.txt
bca audi
kumar nudi
mca bca

Regelnummers (, en = optie)

Selecteren van regels met behulp van regelnummers. Om in de derde regel een term te vervangen:

dany@linux-e1kr:~> sed '3 s/surendra/bca/' tem.txt
surendra audi
kumar nudi
mouni bca

Om vanaf regel 1 tot en met regel 3 een term te vervangen:

dany@linux-e1kr:~> sed '1,3 s/surendra/bca/' tem.txt
bca audi
kumar nudi
mouni bca

Om van de tweede regel tot het einde van het bestand een term te vervangen:

dany@linux-e1kr:~> sed '2,$ s/surendra/bca/' tem.txt
surendra audi
kumar nudi
mouni bca

Met de N optie kan je twee regels combineren tot één regel met behoud van het nieuwe regel teken in de gecombineerde regel.

dany@linux-e1kr:~> sed 'N' tem.txt
surendra audi
kumar nudi
mouni surendra

De uitvoer verschilt niet van de inhoud van het bestand, als je het verschil wilt zien, moet je het nieuwe regel teken (\n) vervangen door een spatie:

dany@linux-e1kr:~> echo "baby dudy" >> tem.txt
dany@linux-e1kr:~> cat tem.txt
surendra audi
kumar nudi
mouni surendra
baby dudy
dany@linux-e1kr:~> sed 'N;s/\n/ /' tem.txt
surendra audi kumar nudi
mouni surendra baby dudy

De regels met de = optie nummeren:

dany@linux-e1kr:~> sed = tem.txt
1
surendra audi
2
kumar nudi
3
mouni surendra
4
baby dudy

Door regels te combineren kunnen we de nummering gescheiden door een tab (\t) voor de regels plaatsen:

dany@linux-e1kr:~> sed = tem.txt | sed 'N;s/\n/\t/'
1       surendra audi
2       kumar nudi
3       mouni surendra
4       baby dudy

Zoeken (/zoekterm/)

Sed kan in een regel met een bepaalde zoekterm een specifieke bewerking uitvoeren. Vervang het woord audi door xyz in alle regels waarin het woord surendra voorkomt:

dany@linux-e1kr:~> sed '/surendra/ s/audi/xyz/' tem.txt
surendra xyz
kumar nudi
mouni surendra
baby dudy

Vervang in de regels 1 tot en met de regel waarin het woord surendra voorkomt het woord audi door xyz:

dany@linux-e1kr:~> sed '1,/surendra/ s/audi/xyz/' tem.txt
surendra xyz
kumar nudi
mouni surendra
baby dudy

Vervang audi door xyz tussen de zoektermen surendra en mouni:

dany@linux-e1kr:~> sed '/surendra/,/mouni/ s/audi/xyz/' tem.txt
surendra xyz
kumar nudi
mouni surendra
baby dudy

Of vanaf de zoekterm surendra tot het einde:

dany@linux-e1kr:~> sed '/surendra/,$ s/audi/xyz/' tem.txt
surendra xyz
kumar nudi
mouni surendra
baby dudy

Omkeren

Deze operator werkt met de w, p en d opties. Deze operator zaait vlug verwarring die door het opdoen van praktische ervaringen verdwijnt. Geef alle regels weer die het woord surendra niet bevatten:

dany@linux-e1kr:~> sed -n '/surendra/ !p' tem.txt
kumar nudi
baby dudy

Verwijder alle regels uitgezonderd diegene die het woord surendra bevatten:

dany@linux-e1kr:~> sed '/surendra/ !d' tem.txt
surendra audi
mouni surendra

Verwijder alle regels, uitgezonderd de regels 1 tot en met 3:

dany@linux-e1kr:~> sed '1,3 !d' tem.txt 
surendra audi
kumar nudi
mouni surendra

Sed scripting (-f optie)

Deze optie is waardevol bij het schrijven van complexe sed scripts. Sed is namelijk zoals bash, awk en perl een script programmeertaal.

sed -f sedscript.sed

Daarbij bevat het bestand sedscript.sed sed opdrachten die moeten uitgevoerd worden.

Handige een-regelige sed scripts

Op het internet kan je verschillende voorbeelden van sed opdrachten terugvinden (van erbarmelijke tot en met professionele kwaliteit). Bezoek bijvoorbeeld de pagina Handige een-regelige scripts voor sed om nog wat meer praktische voorbeelden te bestuderen.