BASH wyrażenia regularne grepa

Potrzebujesz pomocy z C, C++, perl, python, itp.
Inkluder
Posty: 7
Rejestracja: 17 grudnia 2010, 15:28

BASH wyrażenia regularne grepa

Post autor: Inkluder »

Szukam sposobu na wypisanie z pliku tylko dat starszych od 1974 i jak na razie mam takie coś.

Kod: Zaznacz cały

grep -E '[0-9]{2}-[0-9]{2}-[1000-1974].' plik
Nie wiem czemu to nie che zadziałać, wypisuje różne daty w tym z poza zakresu..
Awatar użytkownika
grzesiek
Junior Member
Posty: 932
Rejestracja: 06 stycznia 2008, 10:41
Lokalizacja: Białystok

Post autor: grzesiek »

Kod: Zaznacz cały

grzesiek@home:~$ echo "12-12-999" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
grzesiek@home:~$ echo "12-12-1010" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
12-12-1010
grzesiek@home:~$ echo "12-12-2010" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
grzesiek@home:~$ echo "12-12-2000" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
grzesiek@home:~$ echo "12-12-1999" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
grzesiek@home:~$ echo "12-12-1975" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
grzesiek@home:~$ echo "12-12-1974" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"
12-12-1974
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Kod: Zaznacz cały

[lessmian@pyrtek ~]$ echo "12-12-1485" | grep -e "^[^-]*-[^-]*-1[0-9][0-7][0-4]"                                                                                                                          
[lessmian@pyrtek ~]$
Jak dla mnie, to nie da się tego tak sprytnie zrobić (a przynajmniej nie widzę w tej chwili takiego sposobu ;) )
Awatar użytkownika
grzesiek
Junior Member
Posty: 932
Rejestracja: 06 stycznia 2008, 10:41
Lokalizacja: Białystok

Post autor: grzesiek »

"jak nie prawą to lewą stroną wjadę" ;)

Kod: Zaznacz cały

grzesiek@home:~$ echo "12-12-1973 xxxxxxxxx ccc" | awk -F: 'BEGIN {FS=" "} {d[0]=0; split($1,d,"-"); if (d[3] <= 1974 && d[3] >= 1000) print $0}'
12-12-1973 xxxxxxxxx ccc
grzesiek@home:~$ echo "12-12-1974 xxxxxxxxx ccc" | awk -F: 'BEGIN {FS=" "} {d[0]=0; split($1,d,"-"); if (d[3] <= 1974 && d[3] >= 1000) print $0}'
12-12-1974 xxxxxxxxx ccc
grzesiek@home:~$ echo "12-12-1975 xxxxxxxxx ccc" | awk -F: 'BEGIN {FS=" "} {d[0]=0; split($1,d,"-"); if (d[3] <= 1974 && d[3] >= 1000) print $0}'
grzesiek@home:~$ echo "12-12-1000 xxxxxxxxx ccc" | awk -F: 'BEGIN {FS=" "} {d[0]=0; split($1,d,"-"); if (d[3] <= 1974 && d[3] >= 1000) print $0}'
12-12-1000 xxxxxxxxx ccc
grzesiek@home:~$ echo "12-12-999 xxxxxxxxx ccc" | awk -F: 'BEGIN {FS=" "} {d[0]=0; split($1,d,"-"); if (d[3] <= 1974 && d[3] >= 1000) print $0}'
da się...
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Albo tak:

Kod: Zaznacz cały

cat plik.txt 
12-12-999
12-12-1010
12-12-2010
12-12-2000
12-12-1999
12-12-1975
12-12-1974
12-12-1485

Kod: Zaznacz cały

grep -e "^[^-]*-[^-]*-1[0-8][0-9][0-9]" plik.txt; grep -e "^[^-]*-[^-]*-19[0-6][0-9]" plik.txt; grep -e "^[^-]*-[^-]*-197[0-4]" plik.txt
12-12-1010
12-12-1485
12-12-1974
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Ale ja nie miałem na myśli, że się w ogóle nie da, tylko, że grepem to raczej ciężko.

Tak na marginesie to wolę perla - ma zajefajne wyrażenia regularne (ach te wsteczne referencje ;) )

Kod: Zaznacz cały

[lessmian@pyrtek ~]$ echo '12-11-1973 dddd' | perl -lne '/\d{1,2}-\d{1,2}-(\d{1,4})/;print if $1 >=1000 && $1 <= 1974'
12-11-1973 dddd
Dodane:
piter, tylko że to trzy uruchomienia grepa, więc i trzy razy więcej czasu, procka itd.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Może być jedno uruchomienie grep'a. Po prostu nie chciało mi się wczoraj szukać operatora 'or' w grep'ie:

Kod: Zaznacz cały

grep -e "^[^-]*-[^-]*-1[0-8][0-9][0-9]\|^[^-]*-[^-]*-19[0-6][0-9]\|^[^-]*-[^-]*-197[0-4]" plik.txt
12-12-1010
12-12-1974
12-12-1485
Inkluder
Posty: 7
Rejestracja: 17 grudnia 2010, 15:28

Post autor: Inkluder »

piter pisze:Może być jedno uruchomienie grep'a. Po prostu nie chciało mi się wczoraj szukać operatora 'or' w grep'ie:

Kod: Zaznacz cały

grep -e "^[^-]*-[^-]*-1[0-8][0-9][0-9]\|^[^-]*-[^-]*-19[0-6][0-9]\|^[^-]*-[^-]*-197[0-4]" plik.txt
12-12-1010
12-12-1974
12-12-1485
Dzięki, właśnie o coś takiego mi chodziło z użycie m tylko grepa. Mam jeszcze jeden problem, jak za pomocą grepa (tylko) zmienić w linijce każde <table/> na coś innego?
Awatar użytkownika
grzesiek
Junior Member
Posty: 932
Rejestracja: 06 stycznia 2008, 10:41
Lokalizacja: Białystok

Post autor: grzesiek »

Kod: Zaznacz cały

grzesiek@home:~$ echo "xx <table/> yy" | sed "s/<table\/>/_/g"
xx _ yy
Tylko nie mów, że uruchomienie drugiego programu za bardzo obciąża system ;)
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Moim zdaniem przy pomocy samego grepa nie da się tego zrobić. Grep służy tylko do wypisywania linii pasujących do wzorca. Do tego typu edycji tekstu służą inne narzędzia np. sed.
ODPOWIEDZ