2011-02-03 13 views
7

Algunas líneas de un archivo no parecen coincidir \ t en una expresión regular. ¿Alguien tendría una idea de por qué?El uso de t en una expresión regular no parece funcionar con todas las pestañas

Tomemos el archivo de ejemplo que puede descargar desde 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

¿Alguna razón para no usar \ s + en su lugar? –

+1

bueno, el archivo está separado por pestañas, así que si juego usando \ s, obtendré entradas diferentes para Andorra la Vella, que se supone que es un solo campo ... –

Respuesta

10

intente usar la opción -P en lugar de -E:

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

Para ello se utilizarán las expresiones regulares al estilo Perl, que cogerá el \t.

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

Gracias. ¿Significa que la expresión regular estándar no es compatible con \ t? –

+1

@Sami Dalouche: ¿cuál es su definición de "regex estándar"? –

+1

@Bryan: Sami probablemente se refiera a POSIX – user123444555621

0

Si leo la documentación para grep veo ninguna mención de que \t representa pestaña. Recuerde, no todos los motores de expresiones regulares son iguales.

0

Las pestañas no son parte de las expresiones regulares POSIX (el estándar para grep). Sin embargo, se puede producir un carácter de tabulación literal de esta manera:

echo -ne "\\t" 

Así, grepping para una pestaña funciona así:

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

o

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

es posible que utilices una ficha literal . Mientras está en el terminal, presione CTRL + V y luego presione la tecla TAB. Eso creará un espacio en blanco de tabulación en el punto del cursor que se puede usar en su expresión regular.

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

Esto buscará cualquier número del 0 al 9 con un carácter de tabulación justo después de él.

Cuestiones relacionadas