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
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 ....

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
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
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
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:
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'