pondělí 26. prosince 2011

Sedy, lehy, regulární výrazy 1

sed, awk, grep a jiné pěkné cli nástroje pro zpracování textu umožňují použití regulárních výrazů, což jsou takové masky, kterými můžete definovat řetězec, který v textu hledáte. Základy znám, ale každou chvíli objevím něco nového, co mi uniklo, protože zas tak svědomitě jsem to nestudaval. A tak bych chtěl začít seriálek, ve kterém bych si tyto objevy zapisoval.

Tak například dneska jsem se opět připletl k něčemu, co mě donutilo trochu posunout znalosti. Šlo o parsování xml dokumentu pomocí sedu a tím zajímavým je vytípnutí výrazu mezi dvěmi uvozovkami. Vzhledem k tomu, že regulární výrazy jsou od přírody žravé a tak těžko vytípnete řetězec v uvozovkách něčím jako toto: var=".*" , když je na řádku těch uvozených výrazů více, potřebujete něco lepšího. Pomohou htanaté závorky, kterými je možné definovat povolené znaky, ale pomocí znaku ^ (stříška), je možné výběr invertovat a definovat tak zakázané znaky. Proto uspějete s následujícím výrazem:

echo '<location altitude="307" latitude="50.92139" longitude="15.07974" geobase="geonames" geobaseid="3076124" />' | \
sed -n 's/ *<location .*latitude="\([^"]*\)".*/\1/p'

50.92139

Pokud nevíte, kulaté, zpětným lomítkem escapované závorky definují subvýraz, na který můžete dále odkazovat pomocí výrazu \1, a pokud je takových subvýrazů více, jsou číslovány podle výskytu zleva do prava.


2 komentáře:

  1. Ahoj,

    je možné nějak formátovat kód v komentářích? Když chci něco připsat, píše mi to v náhledu komentáře nesmysly (spíš chybí kusy kódu).

    OdpovědětVymazat
  2. Problém jsou především uzavřené tagy </>, protože je v komentářích povoleno používat některé html tagy. Je dobré tyto znaky přepsat pomocí &#38lt/&#38gt, tabulka pro náhradu speciálních znaků je třeba zde:
    http://www.yellowpipe.com/yis/tools/ASCII-HTML-Characters/index.php
    Určitě budou i nějaké online konvertory pro tento účel.

    OdpovědětVymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.