zeama de sed
Sed e un instrument fenomenal, dar n-am apucat niciodata sa invat suficient de bine lucrul avansat cu el. De exemplu, cum sa procesez mai multe linii deodata. Am avut ocazia sa ma joc cu asta ieri, cand pe #mumu a aparut urmatoarea problema:
Q: se da un fisier care din loc in loc are linii care contin doar "1". Se doreste ca acel 1 sa fie concatenat la linia anterioara, adica 'mumu\n1\n' sa devina 'mumu 1\n'. Preferabil cu sed
A: Se constata relativ repede ca nu prea merge cu s/\n1\n/ 1\n/, pentru ca sed citeste fisierul linie cu linie si \n-urile dispar pana in faza de match. Solutia ar fi sa citesti cate 2 linii, si daca a doua indeplineste conditia, sa operezi pe amandoua. Dat fiind ca aseara pe tren am avut priza dar n-am avut internet, m-am inspirat de prin exemplele din info sed si am produs urmatoarea chestie (am inclus si ceva comentarii, probabil insuficiente pentru cineva care nu stie sed de loc, dar daca e nevoie de lamuriri suplimentare astept mail):
#!/bin/sed -f
# copiez linia in pattern space
h
#label pentru goto-urile ulterioare
:b
#daca e ultima linie, exit (si implicit print, din lipsa de -n la argumente)
$b
#citesc linia urmatoare si o adaug la pattern space
N
#daca pattern space contine ce trebuie, execut blocul urmator
/\n1$/ {
# schimb newline in spatiu
s/\n/ /
#sar la :b (poate si linia urmatoare trebuie concatenata)
bb
#am terminat blocul
}
#daca am citit ultima linie, ies, nu mai e nimic de facut
#dat fiind ca sed nu e apelat cu -n, tipareste ce e in pattern space
$b
#daca nu, tiparesc prima linie din pattern space (concatenat sau nu)
P
#sterg prima linie din pattern space si merg mai departe
#(daca a mai ramas ceva in p.s. nu mai citeste din fisier)
D
Nu am pretentia ca mi-e _foarte_ clar sau ca pot sa-l rescriu fara sa trag cu ochiul, am manarit un script din info page, dar face ce trebuie si ia in considerare toate cazurile care mi-au trecut prin cap (linii cu '1' consecutive si ambele cazuri de terminare a fisierului). Anyway, fun!