Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: grep '^[^#]' - jak to, že to funguje? ---- '^vyřešeno[^#]'  (Přečteno 3235 krát)

arrange

  • Závislák
  • ***
  • Příspěvků: 4031
  • "jdu s hlavou vztyčenou..."
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
« Poslední změna: 09 Dubna 2009, 20:35:32 od arrange »
http://www.openstreetmap.org - mapy celého světa "wiki style"

Yontalcar

  • Stálý člen
  • **
  • Příspěvků: 833
  • Semper fidelis
Re: grep '^'' - jak to, že to funguje?
« Odpověď #1 kdy: 09 Dubna 2009, 14:28:30 »
protože na prázdném řádku není písmeno '[^#]'
NB: ASUS X53U - AMD Brazos E450; Debian GNU/Linux Sid amd64 (KDE 4.14)
Jen dvě věci jsou nekonečné - vesmír a lidská hloupost. Tím prvním si ovšem nejsem tak jist. - Albert Einstein

arrange

  • Závislák
  • ***
  • Příspěvků: 4031
  • "jdu s hlavou vztyčenou..."
Re: grep '^[^#]' - jak to, že to funguje?
« Odpověď #2 kdy: 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?
http://www.openstreetmap.org - mapy celého světa "wiki style"

Yontalcar

  • Stálý člen
  • **
  • Příspěvků: 833
  • Semper fidelis
Re: grep '^[^#]' - jak to, že to funguje?
« Odpověď #3 kdy: 09 Dubna 2009, 16:59:20 »
první znak v prázdném řádku není
NB: ASUS X53U - AMD Brazos E450; Debian GNU/Linux Sid amd64 (KDE 4.14)
Jen dvě věci jsou nekonečné - vesmír a lidská hloupost. Tím prvním si ovšem nejsem tak jist. - Albert Einstein

arrange

  • Závislák
  • ***
  • Příspěvků: 4031
  • "jdu s hlavou vztyčenou..."
Re: grep '^[^#]' - jak to, že to funguje?
« Odpověď #4 kdy: 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?
http://www.openstreetmap.org - mapy celého světa "wiki style"

Vojtěch Trefný

  • Příspěvků: 9307
  • Don Quijote
Re: grep '^[^#]' - jak to, že to funguje?
« Odpověď #5 kdy: 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...

arrange

  • Závislák
  • ***
  • Příspěvků: 4031
  • "jdu s hlavou vztyčenou..."
Re: grep '^[^#]' - jak to, že to funguje? -- '^vyřešeno[^#]'
« Odpověď #6 kdy: 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.
http://www.openstreetmap.org - mapy celého světa "wiki style"

 

Provoz zaštiťuje spolek OpenAlt.