2012-03-16 17 views
6

que tienen líneas como¿Cómo encontrar líneas que contengan más de un solo espacio en blanco entre cadenas en Unix?

1|Harry|says|hi 
2|Ron|says|bye 
3|Her mi oh ne|is|silent 
4|The|above|sentence|is|weird 

Necesito un comando grep que va a detectar la tercera línea.

Esto es lo que estoy haciendo.

grep -E '" "" "+' $dname".txt" >> $dname"_error.txt" 

La lógica en la que Estoy basando esto es, el primer espacio en blanco debe ser seguido por uno o más espacios en blanco para ser detectado como un error.

$ dname es una variable que contiene la ruta del nombre del archivo.

¿Cómo obtengo mi resultado deseado?

(que es

 3|Her mi oh ne|is|silent 

)

Respuesta

4

Sólo esto va a hacer:

grep " " ${dname}.txt >> ${dname}_error.txt 

Los dos espacios en una hermosa obra citada cadena. El -E convierte el patrón en una expresión regular extendida, lo que lo hace innecesariamente complicado aquí.

+0

El '-E' convierte el patrón en una expresión regular extendida, los patrones grep son siempre expresiones regulares, a menos que se especifique la opción' -F'. – huon

+1

De ahí el nombre. Sí, me resbalé; editado –

7
grep '[[:space:]]\{2,\}' ${dname}.txt >> ${dname}_error.txt 

Si desea capturar 2 o más espacios en blanco.

+0

esta es la respuesta genérica y, por lo tanto, debe aceptarse ... –

0

Si desea 2 o más espacios, entonces:

grep -E "\s{2,}" ${dname}.txt >> ${dname}_error.txt 

La razón por la cual su patrón que no funciona es debido a las comillas en el interior. \s se utiliza para [espacio]. En realidad podría hacer lo mismo con:

grep -E ' +' ${dname}.txt >> ${dname}_error.txt 

Pero es difícil decir exactamente lo que está buscando con esa versión. \s\s+ también funcionaría, pero \s{2,} es el más conciso y también le da la opción de establecer un límite superior. Si desea buscar 2, 3 o 4 espacios en una fila, debe usar \s{2,4}

+0

Hola, lo siento, pero esto no funciona. Tendré que intentar solucionarlo ... – wave5459

+0

Ambos han sido probados y funcionan en grep (GNU grep) 2.9. ¿Qué versión está utilizando? –

+0

Me parece que podría necesitar volver a examinar su definición de "conciso" :-) – paxdiablo

1

a continuación son las cuatro formas.

pearl.268> sed -n 's/ /&/p' ${dname}.txt >> ${dname}_error.txt 
pearl.269> awk '$0~/ /{print $0}' ${dname}.txt >> ${dname}_error.txt 
pearl.270> grep ' ' ${dname}.txt >> ${dname}_error.txt 
pearl.271> perl -ne '//&& print' ${dname}.txt >> ${dname}_error.txt 
Cuestiones relacionadas