Obtener contenido antes de un colon

8

Tengo un archivo de texto en Linux donde los contenidos son los siguientes:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

Quiero obtener el contenido antes de los dos puntos como a continuación:

help.helloworld.com
dev.helloworld.com

¿Cómo puedo hacer eso dentro de la terminal?

Gabrial Johnas
fuente
2
La greputilidad se utiliza para buscar líneas que coincidan con expresiones regulares. Posiblemente podría usarlo aquí, pero sería más apropiado usar una herramienta que extraiga datos de los campos dados algún delimitador, como la cututilidad.
Kusalananda
He enviado una edición para eliminar la palabra "grep" y reemplazarla con "find" en el título y "get" en el cuerpo de la pregunta, para evitar el problema X / Y de asumir que grepes la herramienta adecuada para resolver el problema real. problema.
Monty Harder
1
Todo lo que puedo decir es que el contenido antes del colon es mucho mejor que el contenido después del colon ;-).
Peter - Restablece a Mónica el

Respuestas:

35

Esto es para lo que cutsirve:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Simplemente establezca el delimitador en :con -d:y dígale que solo imprima el primer campo ( -f1).

terdon
fuente
19

O una alternativa:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Esto devuelve los caracteres que comienzan al comienzo de cada línea ( ^) que no son dos puntos ( [^:]*).

Freddy
fuente
18

Definitivamente recomendaría awk:

awk -F ':' '{print $1}' file

Se utiliza :como separador de campo e imprime el primer campo.

Centimane
fuente
5

respuesta actualizada

Considerando el siguiente archivo file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Puede usar sedpara eliminar todo después de los dos puntos:

sed -e 's/:.*//' file.txt

Esto funciona para todos los casos de esquina señalados en los comentarios, si termina en dos puntos o si no hay dos puntos, aunque estos no se mencionaron en la pregunta misma. Gracias a @Rakesh Sharma, @mirabilos y @Freddy por sus comentarios. Responder preguntas es una excelente manera de aprender.

Randy Josleyn
fuente
44
sed -e 's/:.*//' file.txtEs otra forma con Posix sed.
Rakesh Sharma
1
sed -ne 'y/:/\n/;P' file.txtTambién se puede utilizar.
Rakesh Sharma
Make .+to.*
Rakesh Sharma
@Randy Joselyn Dado que hay una implícita ifen la s///psintaxis, resulta necesario modificar su expresión regular para hacerse cargo de las líneas sin signos de dos puntos, algo así como: sed -nEe 's/([^:]*)(:.*|)/\1/p'. Tenga en cuenta que esto requiere, GNU sedpero dado que de todos modos está en GNU sed, esto no debería importar.
Rakesh Sharma
Esta respuesta podría haber sido mi favorita, pero las ERE son innecesarias. sed -n '/:/s/^\([^:]*\):.*$/\1/p(agregue --posixsi usa GNU sed, solo para
renunciar
4

Requiere GNU grep. No funcionaría con el grep predeterminado en, por ejemplo, macOS o cualquiera de los otros BSD.

Quieres decir así:

grep -oP '.*(?=:)' file

Salida:

help.helloworld.com
dev.helloworld.com
schrodigerscatcuriosity
fuente
44
Si hay dos o más dos puntos en la línea, esto imprimirá todo hasta el último, así que no es lo que necesita el OP. Tratar echo foo:bar:baz | grep -oP '.*(?=:)'. Esto funcionará para el ejemplo del OP, pero no para el caso general como se describe en la pregunta.
terdon
solo hay un colon y funciona bien, pero gracias por la actualización
Gabrial Johnas
-1

Puede lograr esto con el manejo de la cadena bash, eliminando la coincidencia más larga de la cadena directamente para cada línea leída así:

for line in $(cat inputfile); do echo "${line%%:*}"; done

Esta podría ser una alternativa útil si está analizando el archivo en un script de shell (aunque sospecho que usar cut podría ser más eficiente).

Jim Rippon
fuente