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.txtMagyarázat: $ cat inputfile.txt
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...
Ami azt jeleni, hogy töröljön minden kimenetet a sed mintázat megtalálásának sorától kezdve.sed -i '/sagittis ipsum/,$d' inputfile.txt
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
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