Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: arrange 09 Dubna 2009, 12:03:02
-
Hraju si s grepem a různými možnostmi jak si nechat vypsat textový soubor bez prázdných řádků a poznámek. Možností je mnoho, mně se nejvíce zalíbila
grep '^[^#]' text.file
protože je (asi) nejkratší a nepotřebuje přepínače typu -Ev. Jen nechápu, jak to, že to funguje. OK --
^ - označuje začátek řádku
[] - seznam
^ na prvním místě v seznamu [] - označuje negaci
Takže by to mělo vypsat řádky, které NEzačínají na #. Ale proč to nepíše i prázdné řádky, ty jsem nikde nevyloučil? Ten příkaz je jakoby ekvivalentní s příkazem grep '^[^# ]' (je tam navíc ta mezera).
Ví někdo, proč to vynechává i ty prázdné řádky?
Příklad$ echo -e '111\n\n\n22222\n\n333333\n#4444'
111
22222
333333
#4444
$ echo -e '111\n\n\n22222\n\n333333\n#4444' | grep '^[^#]'
111
22222
333333
-
protože na prázdném řádku není písmeno '[^#]'
-
protože na prázdném řádku není písmeno '[^#]'
No to je pravda, ale zápis ^[^#] by měl znamenat řádky, jejichž první znak je NEkřížek. Co je prvním znakem v prázdném řádku? $? Prázdný znak? Obojí ale vyhovuje té podmínce - je to NEkřížek, takže by se měl vypsat, ne?
-
první znak v prázdném řádku není
-
první znak v prázdném řádku není
Myslel jsem si, že 'žádný znak' patří do množiny 'nekřížek', proto to nechápu.
To tedy znamená, že ten zápis (grep '^[^#]') je ekvivalentní zápisu grep -E '^[^#]+', tzn., že na začátku musí být ASPOŇ JEDEN znak, aby byla ta podmínka vůbec posuzována?
-
Logicky to je tak, že podmínka "zkontroluj jestli je první znak křížek" automaticky selže v případě, že první znak neexistuje... Je to jednoduchá posloupnost implikací, takže pokud selže už první podmínka, tak se další ani nevyhodnocuje...
-
Jasně, znamená to tedy, že tam aspoň jeden znak být musí. Díky za pomoc.
Je to asi jasné, protože když to aplikuju na delší posloupnost (ne na prádný řádek), tak třeba $ echo -e 'abcde12\nabcde' | grep '^abcde[^#]' # posloupnost abcde a pak nekřížek
abcde12
pak je to jasnější.
Vyřešeno.