2011-02-03 11 views
7

Niektóre wiersze pliku nie pasują do \ t w wyrażeniu regularnym. Czy ktoś ma pomysł, dlaczego?Używanie t w wyrażeniu regularnym nie działa z wszystkimi zakładkami

Weźmy przykładowy plik, który można pobrać z http://download.geonames.org/export/dump/countryInfo.txt.

$ wget http://download.geonames.org/export/dump/countryInfo.txt 
--2011-02-03 16:24:08-- http://download.geonames.org/export/dump/countryInfo.txt 
Resolving download.geonames.org... 178.63.52.141 
Connecting to download.geonames.org|178.63.52.141|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 31204 (30K) [text/plain] 
Saving to: `countryInfo.txt' 

100%[===================================================================================================================================================================================================>] 31,204  75.0K/s in 0.4s  

2011-02-03 16:24:10 (75.0 KB/s) - `countryInfo.txt' saved [31204/31204] 

$ cat countryInfo.txt | grep -E 'AD.AND' 
AD AND 200 AN Andorra Andorra la Vella 468 84000 EU .ad EUR Euro 376 AD### ^(?:AD)*(\d{3})$ ca 3041565 ES,FR 
[email protected]:/tmp$ cat countryInfo.txt | grep -E 'AD\tAND' 
(no result) 

output of vi :set list 
AD^IAND^I200^IAN^IAndorra^IAndorra la Vella^I468^I84000^IEU^I.ad^IEUR^IEuro^I376^IAD###^I^(?:AD)*(\d{3})$^Ica^I3041565^IES,FR^I$ 
+0

Jakiś powód, by nie używać \ s + zamiast tego? –

+1

cóż, plik jest oddzielony tabulatorami, więc jeśli dopasuję używając \ s, otrzymam inne wpisy dla Andorra la Vella, która ma być tylko jednym polem. –

Odpowiedz

10

Spróbuj użyć opcji -P zamiast -E:

cat countryInfo.txt | grep -P 'AD\tAND' 

To będzie używać wyrażeń regularnych w stylu Perl, który złapie \t.

$ echo -e '-\t-' | grep -E '\t' 
(no result) 
$ echo -e '-\t-' | grep -P '\t' 
- - 
+0

Dzięki. Czy to znaczy, że standardowe wyrażenie regularne nie obsługuje \ t? –

+1

@Sami Dalouche: Jaka jest Twoja definicja "standardowego regex"? –

+1

@Bryan: Sami prawdopodobnie odnosi się do POSIX – user123444555621

0

Jeśli czytam dokumentację grep widzę żadnej wzmianki, że \t reprezentującą kartę. Pamiętaj, że nie wszystkie silniki z wyrażeniami regularnymi są takie same.

0

Karty nie są częścią wyrażeń regularnych POSIX (standard dla grep). Ale można produkować dosłownego kartę charakter takiego:

echo -ne "\\t" 

Więc grepping na karcie działa tak:

grep "AD$(echo -ne "\\t")AND" 

lub

t=$(echo -ne "\\t") 
grep "AD${t}AND" 
0

Mogłeś po prostu użyć kartę dosłownego . Będąc w terminalu naciśnij CTRL + V, a następnie naciśnij klawisz TAB. To spowoduje, że w punkcie kursora pojawi się biała spacja, którą można użyć w wyrażeniu regularnym.

ls | grep -E "[0-9]<CTRL+V><TAB>]" 

To wyszukiwania dla dowolnej liczby od 0 do 9 o charakterze zakładki tuż po nim.

Powiązane problemy