2011-02-03 5 views
7

Alcune righe di un file non sembrano corrispondere a \ t in un'espressione regolare. Qualcuno avrebbe un'idea del perché?L'uso di t in un'espressione regolare non sembra funzionare con tutte le schede

Prendiamo il file di esempio che è possibile scaricare da 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

Qualsiasi motivo per non utilizzare \ s + invece? –

+1

beh, il file è separato da tabulazione, quindi se abbino usando \ s, otterrò voci diverse per Andorra la Vella, che dovrebbe essere solo un campo .. –

risposta

10

Prova utilizzando l'opzione -P invece di -E:

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

Questo userà stile Perl espressioni regolari, che cattura l'\t.

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

Grazie. Significa che la regex standard non supporta \ t? –

+1

@Sami Dalouche: qual è la tua definizione di "regex standard"? –

+1

@Bryan: Sami è probalby riferendosi a POSIX – user123444555621

0

Se leggo la documentazione per grep vedo alcuna menzione quella scheda \t rappresenta. Ricorda, non tutti i motori di espressioni regolari sono uguali.

0

Le schede non fanno parte delle espressioni regolari POSIX (lo standard per grep). Ma si può produrre un carattere di tabulazione letterale in questo modo:

echo -ne "\\t" 

Così, grep per una scheda funziona in questo modo:

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

o

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

si potrebbe utilizzare una scheda letterale . Mentre si è nel terminale, premere CTRL + V e quindi premere il tasto TAB. Ciò creerà uno spazio bianco di tabulazione nel punto del cursore che può essere usato nell'espressione regolare.

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

Questo cercherà qualsiasi numero da 0 a 9 con un carattere di tabulazione subito dopo.

Problemi correlati