Disassembler

Artificial intelligence is no match for natural stupidity.
15ledna2014

Regulární výraz k vyčištění konfiguráků


Často potřebuju projít až téměř chorobně zakomentované konfigurační soubory a vysypat z nich pouze řádky, které skutečně něco nastavují. Hodí se to zejména v případech, kdy mě zajímá, co všechno je nastaveno ve všelijakých výchozích konfiguracích přibalených k balíčkům v oficiálních linuxových repozitářích, kde není výjimkou, že takový konfigurák obsahuje 2000 řádků, ale 1800 z nich jsou jen komentáře, snažící se administrátorovi nahradit požitek z RTFMování.

Citrus paradisi


Bavíme-li se o plaintextových konfiguračních souborech, kde jsou komentáře uvozeny mřížkou nebo středníkem, je to v zásadě jednoduché. Chci ze souboru vypsat všechny řádky, které splní všechny následující podmínky:

Přičemž počáteční znak samozřejmě může být i odsazen, takže začátek řádku v tomto případě znamená první non-whitespace znak. Protože grep umožňuje přepínačem -v výsledek regexpu i otočit – tj. nevypisovat řádky, které danému reguláru odpovídají, ale vypisovat jen ty, které mu neodpovídají, je jednodušší regexp postavit tak, že grep bude hledat řádky nesplňující výše uvedené podmínky, zahazovat je, a vypisovat všechno ostatní. Tedy můj regexp bude hledat řádky, které splňují jednu z následujících podmínek:

A začátkem řádku se opět myslí první non-whitespace znak. PCRE regulární výraz tedy bude

^\s*(?:[#;]|$)

Pozn.: Otazník a dvojtečka vyjadřují nezachytávající skupinu, protože nepotřebuju vytvářet backreference.

Test


Mějme soubor test.conf s následujícím obsahem:

# komentar 2
radek 1

     # komentar 2
radek 2   # inline komentar

; komentar 3
radek 3

Grep mi pak při správném použití vygrepuje

root@devbuntu:~# grep -vP '^\s*(?:[#;]|$)' test.conf
radek 1
radek 2   # inline komentar
radek 3