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

Název: grep '^[^#]' - jak to, že to funguje? ---- '^vyřešeno[^#]'
Přispěvatel: 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
Kód: [Vybrat]
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
Kód: [Vybrat]
$ 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
Název: Re: grep '^'' - jak to, že to funguje?
Přispěvatel: Yontalcar 09 Dubna 2009, 14:28:30
protože na prázdném řádku není písmeno '[^#]'
Název: Re: grep '^[^#]' - jak to, že to funguje?
Přispěvatel: arrange 09 Dubna 2009, 15:16:37
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?
Název: Re: grep '^[^#]' - jak to, že to funguje?
Přispěvatel: Yontalcar 09 Dubna 2009, 16:59:20
první znak v prázdném řádku není
Název: Re: grep '^[^#]' - jak to, že to funguje?
Přispěvatel: arrange 09 Dubna 2009, 20:15:29
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?
Název: Re: grep '^[^#]' - jak to, že to funguje?
Přispěvatel: Vojtěch Trefný 09 Dubna 2009, 20:21:40
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...
Název: Re: grep '^[^#]' - jak to, že to funguje? -- '^vyřešeno[^#]'
Přispěvatel: arrange 09 Dubna 2009, 20:34:25
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
Kód: [Vybrat]
$  echo -e 'abcde12\nabcde' | grep '^abcde[^#]' # posloupnost abcde a pak nekřížek
abcde12
pak je to jasnější.

Vyřešeno.