Sed példák

Egy mintázat cserélése sorokban

vi quote.txt 
There is only one thing that makes a dream impossible to achieve: the fear of failure. 
 - Paulo Coelho, The Alchemist


s substitution, azaz csere, talán a legfontosabb sed képesség

Az egy kettőre cserélése a quote.txt fájlban
sed -i 's/one/two/' quote.txt

Magyarázat: egy sorban így csak egy cserét csinál, de minden sorban. A -i kapcsoló (in-place editing) azt jelenti, hogy az eredményt visszaírja a fájlba és nem pedig a kimenetre (stdout) küldi.

sed -i 's/one/two/' quote.txt >quote2.txt

Miért nem jó?


Az üres korsó teli korsóra cserélése
echo "üres korsó" | sed 's/üres/teli/'

Magyarázat: Lehet | használatával is beleírányítani szöveget a sed-be.

mennyi csere történik?

echo "one two three, one two three
four three two one
one hundred" > szamok.txt

sed 's/one/ONE/' <szamok.txt

ONE two three, one two three
four three two ONE
ONE hundred

Miért?

Használd a g kapcsolót, ha minden előfordulást cserélni akarsz!

Manipuláció sorokkal

Minden második sor kiszedése seddel egy fasta fájlból
cat SSRs_2-mers_min-repeats\=7_flank-len\=40.fasta | sed -n '1~2p'> fasta.fejlec
cat SSRs_2-mers_min-repeats\=7_flank-len\=40.fasta | sed -n '2~2p'> fasta.adat

Magyarázat: a sed alapértelemzetten a kimentre küldi a sorokat, a -n kapcsolóval elnyomjuk ezt (ne printeld ki  a sorokat) majd a 1~2p opcióval megadjuk, hogy minden páratlan és minden páros sort nyomtasson csak ki a kimenetere.

Megtalált minta felhasználása

cat salesdata.txt
Fred apples 20 November 4
Susy oranges 5 November 7
Mark watermelons 12 November 10
Terry peaches 7 November 15

sed 's/[A-Z]*/(&)/' salesdata.txt
sed 's/[a-z]*/(&)/i' salesdata.txt

Hasonlítsuk össze az eredményeket!

Nos, akkor ez mit fog vajon csinálni?

sed 's/[A-Z]*/(&) &/' salesdata.txt

Kiterjesztett reguláris kifejezés kezelés
sed -r 

például lehetővé teszi a + hazsnálatát, amit alapból nem támogat a sed!


Egy magadott mintázat utáni rész levágása egy fájlból

sed '/sagittis ipsum/q' inputfile.txt
Magyarázat:

$ cat inputfile.txt

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed et nibh ornare, sollicitudin justo ut, aliquam neque.
Vivamus feugiat elit aliquet, sagittis ipsum et, mollis dolor.
Mauris a lacus sit amet orci efficitur feugiat et viverra urna.
Nunc efficitur ex quis magna vehicula, a posuere dui maximus.

Az első három sorig marad meg a fájl, az utána található sorok levágódnak, mert a harmadik sorban található minta egyezés után kilép a sed

Egy kicsit más megoldás a minta egyezés sorával együtt eldobni a fájl végét:

sed '/sagittis ipsum/,$d' inputfile.txt

Ez végrehajtható azonnal a fájlban is...

sed -i '/sagittis ipsum/,$d' inputfile.txt

Ami azt jeleni, hogy töröljön minden kimenetet a sed mintázat megtalálásának sorától kezdve.

Egy még kompexebb megoldás, habár ez nem kombinálható a fájlba visszaírással:

sed -n '/sagittis ipsum/q;p' inputfile.txt

Ami azt jelenti, hogy a sed lépjen ki amikor a mitázatot megtalálja, egyébként pedig nyomtassa ki a sorokat.
A -n elnyomja a sed alapértelmezett sor nyomtatását. Azaz így mintázatot tartalmazó sor sem lesz benne a kimentben.


Teljes fájl beszúrása egy másik fájlba

Egy adott mitázat megtalálása után
sed '/Vivamus/ r masik_fajl.txt' inputfile.txt

Egy kicsit bonyolultabb a mintázat elé beszúrni, de jó példa, hogy lássuk, hogy a sed egy elképesztően nagy tudású és rugalmas eszköz

sed $'/Vivamus/{e cat masik_fajl.txt\n}' inputfile.txt

Néhány sor beszúrása egy fájlba egy megadott mitázat után

sed '/^Vivamus/r'<(
echo "Maecenas sollicitudin ligula nec nunc tristique, vel laoreet augue placerat."
echo "Nam vel tellus eu dui tristique tincidunt."
echo "Sed feugiat elit non lectus placerat, vitae varius ex faucibus.") -i -- inputfile.txt

Magyarázat: Itt gyakorlatilag röptében előállítottuk a fájlt és a küldjük bele a sedbe.

Sorok beszúrása mitázat elé:

sed -i '/^Vivamus/i Maecenas sollicitudin ligula nec nunc tristique, vel laoreet augue placerat.\nNam vel tellus eu dui tristique tincidunt.\nSed feugiat elit non lectus placerat, vitae varius ex faucibus.' inputfile.txt



Email címek validálása és átalakítása seddel

$ cat email_cimek.txt
banm@vocs.unideb.hu
banm-@vocs.unideb.hu
banm_@vocs.unideb.hu
banm@vocs.unideb.hu;
banm@vocs.unideb.hu:
banm@ vocs.unideb.hu
banm@.vocs.unideb.hu
banm @vocs.unideb.hu

Email címek validálása, azaz, a csak helyes címek kiiratása:
sed -nr "/([a-z]+)@([a-z]+\.[a-z]+\.[a-z]+$)/p" email_cimek.txt
Át tudjátok alakítani úgy a fenti regexp-et, hogy a zölddel jelölt sor is bekerüljön a helyes formátumok közé?


Teljes szövegfolyam kiiratása és a helyes formátumú email címek átalakítása a @ jel helyett _at_

sed -E "s/([a-z]+)@([a-z]+\.[a-z]+\.[a-z]+)$/\1_at_\2/" email_cimek.txt

Kiváló sed tutorialok:

https://www.grymoire.com/Unix/Sed.html
https://www.tutorialspoint.com/sed/sed_pattern_buffer.htm

Ultime modifiche: Monday, 15 November 2021, 09:22