Pregunta grep: relaciona todos los caracteres hasta (sin incluir) el primer espacio en blanco


Tengo un archivo de texto que tiene el siguiente formato:

characters(that I want to keep) (space) characters(that I want to remove)

Así por ejemplo:

foo garbagetext
hello moregarbage
keepthis removethis
(etc.)

Así que estaba tratando de usar el comando grep en Linux para mantener solo los caracteres en cada línea y sin incluir el primer espacio en blanco. He intentado numerosos intentos como:

grep '*[[:space:]]' text1.txt > text2.txt
grep '*[^\s]' text1.txt > text2.txt
grep '/^[^[[:space:]]]+/' text1.txt > text2.txt

tratando de reconstruir a partir de diferentes ejemplos, pero no he tenido suerte. Todos ellos producen un blanco text2.txt archivo. Soy nuevo en esto. ¿Qué estoy haciendo mal?

*EDITAR:

Las partes que quiero mantener incluyen letras mayúsculas. Por lo tanto, quiero mantener todos los caracteres / todos y sin incluir el espacio en blanco (eliminando todo del espacio en blanco hacia adelante) en cada línea.

**EDITAR:

El texto basura (que deseo eliminar) puede contener cualquier cosa, incluidos espacios, caracteres especiales, etc. Así que por ejemplo:

AA rough, cindery lava [n -S]

despues de correr grep -o '[^ ]*' text1.txt > text2.txt, la línea de arriba se convierte en:

AA
rough,
cindery
lava
[n
-S]

en text2.txt. (Todo lo que quiero mantener es AA)


SOLUCIÓN (proporcionada por Rohit Jain con más información de beny23):

 grep -o '^[^ ]*' text1.txt > text2.txt

15
2018-02-03 20:04


origen


Respuestas:


Usted está poniendo cuantificador * en el lugar equivocado

Pruebe en cambio esto:

grep '^[^\s]*' text1.txt > text2.txt

o mejor: -

grep '^\S*' text1.txt > text2.txt  

\S significa partido espacio no blanco personaje. Y ancla ^ se usa para coincidir al comienzo de la línea.


20
2018-02-03 20:06



Me doy cuenta de que esto se ha respondido desde hace tiempo con la solución grep, pero para las generaciones futuras me gustaría señalar que hay al menos otras dos soluciones para esta situación particular, ambas son más eficientes que grep.

Como no está haciendo ninguna coincidencia compleja de patrones de texto, simplemente tomando la primera columna delimitada por un espacio, puede usar algunas de las utilidades basadas en columnas, como awk o cut.

Usando awk

$ awk '{print $1}' text1.txt > text2.txt

Usando corte

$ cut -f1 -d' ' text1.txt > text2.txt

Puntos de referencia en un archivo ~ 1.1MB

$ time grep -o '^[^ ]*' text1.txt > text2.txt

real    0m0.064s
user    0m0.062s
sys     0m0.001s
$ time awk '{print $1}' text1.txt > text2.txt

real    0m0.021s
user    0m0.017s
sys     0m0.004s
$ time cut -f1 -d' ' text1.txt > text2.txt

real    0m0.007s
user    0m0.004s
sys     0m0.003s

awk es aproximadamente 3 veces más rápido que grepy cut es aproximadamente 3 veces más rápido que eso. De nuevo, no hay mucha diferencia para este pequeño archivo en una sola ejecución, pero si está escribiendo un script, por ejemplo, para volver a usarlo o hacerlo a menudo en archivos grandes, puede apreciar la eficiencia adicional.


11
2017-08-13 18:32



Utilizo egrep mucho para ayudar a "colorear" las líneas de registro, por lo que siempre estoy buscando un nuevo giro en la expresión regular. Para mí, lo anterior funciona mejor al agregar un \ W así:

$ egrep --color '^\S*\W|bag' /tmp/barf -o
foo
bag
hello
bag
keepthis
(etc.)

El problema es que mis archivos de registro casi siempre tienen un sello de tiempo, así que agregué una línea al archivo de ejemplo:

2013-06-11 date stamped line

y luego no funciona tan bien. Así que volví a mi expresión regular anterior:

egrep --color '^\w*\b|bag' /tmp/barf

pero las líneas sin fecha reveló problemas con ese. Es difícil ver esto sin coloración ...


0
2018-06-12 03:47