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?
text-processing
grep
Gabrial Johnas
fuente
fuente
grep
utilidad 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 lacut
utilidad.grep
es la herramienta adecuada para resolver el problema real. problema.Respuestas:
Esto es para lo que
cut
sirve:Simplemente establezca el delimitador en
:
con-d:
y dígale que solo imprima el primer campo (-f1
).fuente
O una alternativa:
Esto devuelve los caracteres que comienzan al comienzo de cada línea (
^
) que no son dos puntos ([^:]*
).fuente
Definitivamente recomendaría
awk
:Se utiliza
:
como separador de campo e imprime el primer campo.fuente
respuesta actualizada
Considerando el siguiente archivo
file.txt
:Puede usar
sed
para eliminar todo después de los dos puntos: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.
fuente
sed -e 's/:.*//' file.txt
Es otra forma con Posix sed.sed -ne 'y/:/\n/;P' file.txt
También se puede utilizar..+
to.*
if
en las///p
sintaxis, 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 sed
pero dado que de todos modos está en GNU sed, esto no debería importar.sed -n '/:/s/^\([^:]*\):.*$/\1/p
(agregue--posix
si usa GNU sed, solo paraQuieres decir así:
Salida:
fuente
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.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í:
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).
fuente
En shell POSIX puro sin usar comandos externos, haría:
fuente