Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: sed [vyřešeno]  (Přečteno 1291 krát)

Kedrigern

sed [vyřešeno]
« kdy: 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.
« Poslední změna: 06 Března 2012, 23:10:32 od Kedrigern »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:sed bug?
« Odpověď #1 kdy: 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č.
« Poslední změna: 06 Března 2012, 19:14:55 od GdH »

Kedrigern

Re:sed bug?
« Odpověď #2 kdy: 06 Března 2012, 23:10:11 »
Děkuji, prostě mi to nedošlo :).

 

Provoz zaštiťuje spolek OpenAlt.