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
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.
Ahoj,
OdpovědětVymazatje 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).
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í &lt/&gt, tabulka pro náhradu speciálních znaků je třeba zde:
OdpovědětVymazathttp://www.yellowpipe.com/yis/tools/ASCII-HTML-Characters/index.php
Určitě budou i nějaké online konvertory pro tento účel.