¿Cómo eliminar el resto de cada línea después de cierto patrón o una cadena en un archivo?


21

Supongamos que tengo una lista de URL en un archivo de texto:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

Quiero eliminar todo lo que viene después de '.com'.

Resultados previstos:

google.com
unix.stackexchange.com
isuckatunix.com

Lo intenté

sed 's/.com*//' file.txt 

pero también se eliminó .com.


¿Hay una razón específica por la que desea buscar .comsolo en lugar de eliminar todo después e incluir el primer /carácter? ¿Y si tuviera una URL como en.wikipedia.org/wiki/Ubuntuen su lista?
Byte Commander

Respuestas:


17

Para eliminar explícitamente todo lo que viene después de ".com", simplemente modifique su solución sed existente para reemplazar ".com (cualquier cosa)" con ".com":

sed 's/\.com.*/.com/' file.txt

Modifiqué tu expresión regular para escapar del primer período; de lo contrario, habría coincidido con algo como "thisiscommon.com/something".

Tenga en cuenta que es posible que desee anclar aún más el patrón ".com" con una barra inclinada hacia adelante para que no recorte accidentalmente algo como "sub.com.domain.com/foo":

sed 's/\.com\/.*/.com/' file.txt

9

Puede usar awkel separador de campo ( -F) de la siguiente manera:

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

Explicación:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

Como desea eliminar todas las cosas después .com, -F '.com'separa la línea con .comy print $1da salida solo a la parte anterior .com. Por lo tanto, $1".com"agrega .comy le da salida esperada.


¿Por qué no solo /como FS y tomar el primer campo?
heemayl


1
@Pandya: Este error con cadena comoacomercial.com/asdsad
cuonglm

@cuonglm Gracias por señalar. Respuesta mejorada
Pandya

4

La mejor herramienta para la edición de archivos in situ no interactiva es ex.

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

Si ha usado viy si alguna vez ha escrito un comando que comienza con dos puntos :, ha usado un comando ex. Por supuesto, muchos de los comandos más avanzados o "sofisticados" que puede ejecutar de esta manera son extensiones de Vim (p :bufdo. Ej. ) Y no están definidos en las especificaciones POSIXex , pero esas especificaciones permiten un grado realmente sorprendente de potencia y flexibilidad en aplicaciones no visuales. edición de texto (ya sea interactivo o automatizado).

El comando anterior tiene varias partes.

-shabilita el modo silencioso para prepararse expara el uso por lotes. (Suprimir mensajes de salida et. Al.)

-cespecifica el comando que se ejecutará una vez que el archivo ( file.txten este caso) se abra en un búfer.

%es un especificador de dirección equivalente a: 1,$significa que el siguiente comando se aplica a todas las líneas del búfer.

ses el comando sustituto con el que probablemente ya estés familiarizado. Se usa comúnmente viy tiene características esencialmente idénticas al scomando desed , aunque algunas de las características avanzadas de expresiones regulares pueden variar según la implementación. En este caso, desde ".com" hasta el final de la línea se reemplaza con solo ".com".

La barra vertical separa los comandos secuenciales que se ejecutarán. En muchas (la mayoría) de las eximplementaciones, también puede usar una -copción adicional , como esta:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

Sin embargo, esto no es requerido por POSIX.

El xcomando sale, después de escribir cualquier cambio en el archivo. A diferencia de lo wqque significa "escribir y salir", xsolo escribe en el archivo si el búfer ha sido editado. Por lo tanto, si su archivo no se modifica, la marca de tiempo se conservará.


1
+1 por usar ex
Jeff Schaller

1
No edita en el lugar. Al menos, no lo hace más que sedel falso -n de Gnu . Lee / escribe en memorias intermedias en disco. Véalo usted mismo con ex -rel preservecomando.
mikeserv 01 de

@mikeserv ¿Cuál es el preservecomando?
Mateen Ulhaq

2

Python muy rápido, simple y sucio:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

Ejecución de la muestra

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
¿Puedo saber el motivo del voto negativo?
Sergiy Kolodyazhnyy

3
Funciona, pero no le importa .com, solo elimina todo, comenzando por el primero /de la línea. (¡lo cual es, en mi opinión, incluso el mejor enfoque!)
Byte Commander

1
@ByteCommander exactamente correcto! Si el nombre de dominio es .net, en otros enfoques, la parte que viene después del dominio y la extensión no se eliminaría, por lo que es más seguro usarla /como separador.
Sergiy Kolodyazhnyy

+1 para respuestas y comentarios que me hacen sentir que estoy en AskUbuntu.com: D
WinEunuuchs2Unix
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.