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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
overprophet
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 22 gru 2008, 19:49
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

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

Post 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...
Ostatnio zmieniony 30 mar 2011, 20:33 przez overprophet, łącznie zmieniany 2 razy.
Awatar użytkownika
Carnophage
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 169
Rejestracja: 03 maja 2008, 22:08
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Lokalizacja: 127.0.0.1
Kontakt:

Re: [wyrażenia regularne] wypisywanie z grep

Post 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
overprophet
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 22 gru 2008, 19:49
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: [wyrażenia regularne] wypisywanie z grep

Post 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 :)
Awatar użytkownika
Carnophage
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 169
Rejestracja: 03 maja 2008, 22:08
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Lokalizacja: 127.0.0.1
Kontakt:

Re: [wyrażenia regularne] wypisywanie z grep

Post 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)
overprophet
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 22 gru 2008, 19:49
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: [wyrażenia regularne] wypisywanie z grep

Post 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}" ?
Ostatnio zmieniony 30 mar 2011, 16:01 przez overprophet, łącznie zmieniany 1 raz.
bigfun
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 109
Rejestracja: 20 mar 2011, 19:08
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Warszawa
Kontakt:

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

Post 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)
"Never argue with idiot. He will drag you down to his level and then beat with experience."

Nie udzielam pomocy poza forum.
overprophet
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 22 gru 2008, 19:49
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

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

Post 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 ;]
bigfun
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 109
Rejestracja: 20 mar 2011, 19:08
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Warszawa
Kontakt:

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

Post 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.
"Never argue with idiot. He will drag you down to his level and then beat with experience."

Nie udzielam pomocy poza forum.
Awatar użytkownika
Carnophage
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 169
Rejestracja: 03 maja 2008, 22:08
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Lokalizacja: 127.0.0.1
Kontakt:

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

Post autor: Carnophage »

Na innej maszynie, na wersji 2.5.3, u mnie rowniez dziala bez apostrofow.
overprophet
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 22 gru 2008, 19:49
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

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

Post 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
Awatar użytkownika
Carnophage
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 169
Rejestracja: 03 maja 2008, 22:08
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Lokalizacja: 127.0.0.1
Kontakt:

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

Post 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.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

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

Post 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'
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości