¿Cómo eliminar todo (en cada línea) en un archivo de texto después de un patrón de caracteres (incluido el patrón)?

¿Cómo eliminar todo (en cada línea) en un archivo de texto después de un patrón de caracteres (incluido el patrón)?

Básicamente necesito lo que obtuvo el OP de esta pregunta pero no quería. ¿Cómo eliminar todo después de un patrón determinado o una cadena en un archivo?

Entonces obtuve datos como:

Something and something ........................... 23
Another one .......................................123
Somethingelse Inc. .................................243

Entonces, lo que quiero es eliminar todos los puntos (y los números) después del espacio.

Hasta ahora, intenté usar el comando del OP allí, pero no funcionó como esperaba porque borra todo después del primer punto que encuentra. Lo que significa que el punto en los datos del tipo Somethinelse Inc. también se elimina.

Intenté hacer que la primera respuesta (sed) de esa pregunta funcionara reemplazando el primer .com con tres puntos y el segundo con un espacio vacío, pero fallé. Esta vez se elimina todo lo que sigue al primer espacio o quedan tres puntos.

La segunda respuesta (ex -sc ...) funcionó como quería el OP, pero me deja algunos puntos, así que tampoco tuve suerte.

También intenté modificar el comando de esta respuesta pero tampoco lo logré.¿Cómo puedo eliminar todo hasta un patrón y todo lo que sigue a otro patrón de una línea?

Respuesta1

sed 's/ \.\..*$//' /path/to/fileDeberia trabajar:

 \.\. - A space followed by two literal periods
.*    - One or characters of any type
$     - End of line 

Respuesta2

Otra solución poco elegante podría ser:

cat path/to/yourfile | sed -E "s/[\.]{2,}//g" | sed "s/[0-9]//g" > path/to/new_file

dónde:

  • -EInterpretar expresiones regulares como expresiones regulares extendidas (modernas)
  • [\.]{2,}hacer coincidir un punto cada dos o más apariciones
  • [0-9]coincidir con todos los dígitos

  • s/expr//gsignifica sustituto combinado exprcon nada tanto como puedas (g)

Respuesta3

Qué tal esto:

sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g'

lo que significa:

uno+a+muchos(\+)puntos(\.)Y cero a muchos(*)espacios( )Y uno+a+muchos(\+) dígitos([[:dígito:]])Y por si acaso alguna(*) espacio en blanco ([[:espacio:]])Y Fin de esta línea ($)

Probado con (tenga en cuenta que inserté "...234" en la segunda fila y tabuladores/espacios al final):

Something and something ........................... 23<Tab>
An ...234 other one .......................................123<space>
Somethingelse Inc. .................................243<some spaces>

Y el resultado:

xb@dnxb:/tmp$ sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g' sample.txt
Something and something 
An ...234 other one 
Somethingelse Inc. 
xb@dnxb:/tmp$ 

información relacionada