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.