2011. január 6.

SED in text editing.

Sorry guys for the comments are in Hungarian language, but it was so complicated and I spent the whole day doing it.

The project was about: matching two lines within a file, within a single text file. Actually, it was matching the beginning of following two lines and comparing them. It was a dictionary having separate lines for all the meanings and the point was to put all the meanings in a single line.

# szótárunkban minden szócikk minden jelentése külön sorban volt.
# egy szócikk és egy jelentés kettő darab space karakterrel volt szeparálva, sehol máshol nem volt két space a fájlban.
# feladatunk, hogy egy szócikk összes jelentését egy sorba tegyük, pontosvesszővel elválasztva.
# ez végül így sikerült:
# sed -n 'x; s/\(.*\n\)\(.*$\)/\2/; G; s/\(.* \)\(.*\)\n\1\(.*\)/\1\2\; \3/; h; s/\(.*\n\)\(.*$\)\|\(^.*\)\(; .*$\)/\2\4/w output.txt' input.txt
# mindezek után még ki kellett törölni a felesleges sortöréseket geditben.
# a parancsok kifejtése alább.

sed -n ' # csendes üzemmód.
x; # a pattern-space-be behívott sort felcseréli a hold space-szel
s/\(.*\n\)\(.*$\)/\2/; # az előző cycle-ből megmaradt hold-space-es anyagból leszedi az első sort, ha van, ha nincs, nem csinál semmit.
G; # hozzáírja a most hold-sp-ben levő új sort a most pattern-sp-ben levő régihez egy sortörés után
s/\(.* \)\(.*\)\n\1\(.*\)/\1\2\; \3/; # ha a p-sp-ben levő 2 sor eleje karakterre megyegyezik, akkor a második sorból törli a szócikket és hozzávezeti a jelentéseket az első sorhoz egy pontosvessző és egy space kíséretében. ha nem egyezik meg, akkor marad a 2 sor, nincs törlés.
h; # felülírja a h-space-t az új 1 vagy 2 sorunkkal.
s/\(.*\n\)\(.*$\)\|\(^.*\)\(; .*$\)/\2\4/w output.txt # ha két sor van, a másodikat, ha egy sor van, az utolsó szót pontosvesszűstül és szpészestül belevezeti a megadott text fileban egy új sorba.
' input.txt # ezt a fájlt dolgozzuk fel.


The SED MANUAL was a huge help, thank you!