Strona 1 z 1

[solved][BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 14:47
autor: overprophet
czytam od godziny o wyrażeniach regularnych i nie potrafię wypisać z pliku linii postaci

Kod: Zaznacz cały

*kom*.cpp
gdzie * to dowolny ciąg znaków [a-zA-Z0-9]*
np dla danych:

Kod: Zaznacz cały

kom.cpp
komtttttt12ttt.cpp
qw1e2rtykom.cpp
qkomq.cpp
kqom.cpp //tylko tego nie powinno wypisać
wynik:

Kod: Zaznacz cały

kom.cpp
komtttttt12ttt.cpp
qw1e2rtykom.cpp
qkomq.cpp
chodzi mi o samo wyrażenie regularne bo mam początek cat plik | grep .... :D
dodam że wpisując

Kod: Zaznacz cały

cat plik | grep [a-zA-Z0-9]*kom[a-zA-Z0-9]*.cpp
nic nie wypisuje...

Re: [wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 15:08
autor: Carnophage
Po pierwsze, wlasnie zabiles niewinnego kotka ;-) cat nie jest tu do niczego potrzebny
Po drugie

Kod: Zaznacz cały

grep -E …
i dziala

Re: [wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 15:19
autor: overprophet
nie mogę sobie z tym poradzić
wpisuje

Kod: Zaznacz cały

grep -E [a-zA-Z0-9]*kom[a-zA-Z0-9]*.cpp plik
i nic nie dostaje na wyjsciu...
plik istnieje i ma dokładnie taką zawartość

Kod: Zaznacz cały

kom.cpp
komtttttt12ttt.cpp
qw1e2rtykom.cpp
qkomq.cpp
kqom.cpp //tylko tego nie powinno wypisać
proszę o podanie całego polecenia :)

Re: [wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 15:27
autor: Carnophage

Kod: Zaznacz cały

[15:25][~]$ cat smiec 
kom.cpp
komtttttt12ttt.cpp
qw1e2rtykom.cpp
qkomq.cpp
kqom.cpp //tylko tego nie powinno wypisać
[15:25][~]$ grep -E [a-zA-Z0-9]*kom[a-zA-Z0-9]*.cpp smiec
kom.cpp
komtttttt12ttt.cpp
qw1e2rtykom.cpp
qkomq.cpp
Dziwne, ze u Ciebie nie dziala (to powyzej to ctr+c ctrl+v z tego tematu na forum)

Re: [wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 15:35
autor: overprophet
Obrazek

jak to wytłumaczyć? może ja coś zepsułem...



EDIT:

to załatwiło sprawe

Kod: Zaznacz cały

cat plik | grep -E [a-zA-Z0-9]*(kom){1}[a-zA-Z0-9]*(.cpp){1}
mam jeszcze pytanie czemu mi nie zadziałała wersja bez "{1}" ?

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 16:01
autor: bigfun
A może spróbuj:

Kod: Zaznacz cały

grep -E '[a-zA-Z0-9]*kom[a-zA-Z0-9]*.cpp' plik
Podaj wersję basha, grepa (grep -V i bash --version)

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 16:04
autor: overprophet
wersja grep

Kod: Zaznacz cały

GNU grep 2.5.4
bash

Kod: Zaznacz cały

GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
sposób bigfun też działa ;]

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 16:12
autor: bigfun
Nie wiem co takiego zmieniło się od wersji 2.5.4 do 2.6.3 (którą ja posiadam), bo u mnie działa również ta wersja bez apostrofów. Trzeba by zajrzeć do changeloga.

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 16:20
autor: Carnophage
Na innej maszynie, na wersji 2.5.3, u mnie rowniez dziala bez apostrofow.

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 16:43
autor: overprophet
no to pytanie na koniec:
czym się różnią te 3 wersje?

Kod: Zaznacz cały


grep -E [a-zA-Z0-9]*kom[a-zA-Z0-9]*.cpp plik
grep -E '[a-zA-Z0-9]*kom[a-zA-Z0-9]*.cpp' plik
grep -E [a-zA-Z0-9]*(kom){1}[a-zA-Z0-9]*(.cpp){1} plik

ale nie w stylu "brakuje apostrofa" tylko w znaczeniu

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 17:15
autor: Carnophage
Apostrofy sluza zwykle jako "ograniczniki" stringow/ciagow znakow. Czyli pierwsze dwie opcje roznia sie tym, ze w drugiej bardziej dobitnie zaznaczone jest wyrazenie regularne. Trzeci przyklad to inne wyrazenie regularne opisujace to samo.

Re: [BASH][wyrażenia regularne] wypisywanie z grep

: 30 mar 2011, 20:19
autor: beluosus
Nie służą jako "ograniczniki" ale bardziej jako "rozszerzalniki". Chodzi o to, że wszystkie parametry oddzielone są spacjami, a jeżeli chcemy przekazać w nich spację (lub inne specjalne znaki powłoki) to zamykamy je w apostrof.
polecenie arg1 'arg 2' arg 3 'a teraz arg 4'
Trzecim parametrem jest arg, a czwartym jest 3.
Dodatkowo jakbyś chciał wyświetlić grepem linie, które zawierają gwiazdkę (znak specjalny) musiałbyś zrobić tak:

Kod: Zaznacz cały

grep '*' plik
Ponieważ znak * jest przez powłokę zamieniany na wszystkie pliki w CWD. Można wykonać polecenie 'echo *' żeby się o tym przekonać.
Jest także różnica między pojedynczym, a podwójnych apostrofem. Pojedynczy jest "dosłowny", a podwójny zamienia nazwy zmiennych na wartości, które przechowują.

Kod: Zaznacz cały

t=tekst
echo '$t'      # $t
echo "$t"      # tekst
echo $t        # tekst
Jeśli zaś chcesz wykorzystać podwójny apostrof w argumencie to stosujesz zapis:

Kod: Zaznacz cały

echo "Oto \"podwójny\" apostrof"
echo 'Oto "podwójny" apostrof'