Strona 1 z 3

BASH wyrażenia regularne grepa

: 17 grudnia 2010, 15:34
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..

: 18 grudnia 2010, 20:18
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

: 18 grudnia 2010, 21:25
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 ;) )

: 18 grudnia 2010, 22:00
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ę...

: 18 grudnia 2010, 22:22
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

: 18 grudnia 2010, 22:37
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.

: 19 grudnia 2010, 17:12
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

: 20 grudnia 2010, 18:25
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?

: 20 grudnia 2010, 20:44
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 ;)

: 20 grudnia 2010, 20:53
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.