Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Kedrigern 06 Března 2012, 16:03:05

Název: sed [vyřešeno]
Přispěvatel: Kedrigern 06 Března 2012, 16:03:05
Psal jsem si skriptík pro korektní vkládání rejstříkových záznamů v LaTeXu a narazil jsem na:
Kód: [Vybrat]
ROOT="Smith"
RECORD='\\index{smith@Smith, John jr.}'         # smaze radek
RECORD2='\\index{smith@Smith, John jr. }'       # "funguje"     
RECORD3='\\index{smith@Smith, John jr.'         # "funguje"
RECORD4='\\index{smith@Smith, John jr}'         # "funguje"

sed -n -e '/'"${RECORD}"'/ p
/'"${RECORD}"'/! s/\('"${ROOT}"'[a-zA-Z.!\?]*\)/\1 '"${RECORD}"'/
/'"${RECORD}"'/! p' text

Pokud použiji na konci substituce $RECORD, tak dané řádky ignoruje.
Pokud použiji $RECORDn, tak (dle mého mínění správně) doplní $RECORD za nalezené slovo obsahující $ROOT.

Soubor text má např. následující obsah:
Kód: [Vybrat]
John Smith je velkolepý -- založil stát Smithosia. Ten samozřejmě do jmenného rejstříku nepatří.

Smithosia?
Smithosia!

Lorem ipsum. Wolfenstein je další z jmen.

Můj výstup:
Výstup, když je použit RECORD2:
Kód: [Vybrat]
John Smith \index{smith@Smith, John jr. } je velkolepý -- založil stát Smithosia. Ten samozřejmě do jmenného rejstříku nepatří.

Smithosia? \index{smith@Smith, John jr. }
Smithosia! \index{smith@Smith, John jr. }

Lorem ipsum. Wolfenstein je další z jmen.
Výstup, když je použit RECORD1:
Kód: [Vybrat]


Lorem ipsum. Wolfenstein je další z jmen.


Pro úplnost účel skriptu:
Pokud se vyskytuje kořen slova ($ROOT) na daném řádku, tak za dané slovo umísti $RECORD.
Nechci rekurzi, či přílišné duplicity, čili ignoruji řádky, kde již $RECORD je.
Název: Re:sed bug?
Přispěvatel: GdH 06 Března 2012, 18:36:24
Já bych řekl, že jsi sed tak nějak špatně pochopil. Zkus tohle, jestli to dělá to co chceš:

Kód: [Vybrat]
sed '/'"${RECORD}"'/! s/\('"${ROOT}"'[a-zA-Z.!\?]*\)/\1 '"${RECORD}"'/' text
Každý z těch příkazů, co jsi napsal, se aplikuje na každý řádek, jeden po druhém. Tobě, pokud jsem správně pochopil, stačí na řádek, na kterém se nenachází RECORD a zároveň nachází ROOT dopsat za ROOT RECORD. Takže je tu test na RECORD a pokud je test negativní, hledá se ROOT, aby se doplnil. Tobě to fungovalo pouze, pokud byl poslední RECORD jiný, než ten druhý, hádej proč.
Název: Re:sed bug?
Přispěvatel: Kedrigern 06 Března 2012, 23:10:11
Děkuji, prostě mi to nedošlo :).