¿Cómo puedo eliminar texto antes de un delimitador en Linux?

16

Necesito eliminar el texto de una línea antes del delimitador.

Por ejemplo:

(123434): hello::{apple,orange,mango}.

Necesito eliminar el texto antes de primero :. es decir (123434).

¿Hay algún comando en Linux para realizar esta tarea?

usuario80538
fuente
Es posible que desee investigar sedoawk
Paul
¿Es este texto parte de un archivo o parte de una variable bash?
Bernhard
Es parte del archivo.
user80538

Respuestas:

14

Este sedcomando debería hacer el truco. El siguiente comando sobrescribirá el archivo:

sed -i 's/^[^:]*:/:/' file

Para imprimir el resultado, elimine la -ibandera. Para poner la salida en un nuevo archivo, elimine la -ibandera y redirija la salida:

sed 's/^[^:]*:/:/' file > new_file
drs
fuente
La línea hizo la magia ... la salida reemplazado en el propio archivo ..
user80538
cuando comparo dos archivos usando sdiff, después de eliminar el texto de ambos archivos, la diferencia me muestra el texto eliminado. este comando sobrescribe el archivo o simplemente muestra el resultado.
user80538
Funcionó ... ¿Puedo extraer 'hola' y {manzana, naranja, mango} de mi ejemplo haciendo cambios simples en el comando anterior?
user80538
@ user80538, es difícil saber qué quieres cuando dices extraer en este contexto. ¿Es esto parte de un script de shell más grande? Es posible que desee hacer una nueva pregunta con los detalles del problema mayor que está tratando de resolver.
Dres.
Es simplemente una comparación simple de dos archivos con los mismos datos, pero solo necesita encontrar dónde difieren los datos en dos archivos. Necesito verificar cada sección individual en la línea. Los datos en secciones individuales pueden confundirse. como {manzana, naranja, mango} puede ser {manzana, mango, naranja}.
user80538
14

Puedes usar cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-
Joseph R.
fuente
5

Puede hacer esto con una instrucción Bash bastante simple :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Esto se imprimirá : hello::{apple,orange,mango}.. Puede cortar prefijos y sufijos de manera similar. Además, las definiciones de prefijo y sufijo pueden contener comodines.

Prefijo de corte: hasta la primera coincidencia de comodín de prefijo: ${variable#prefix}

Prefijo de corte: hasta la última coincidencia de comodín de prefijo: ${variable##prefix}

Cortar sufijo: hasta la primera coincidencia de comodín con sufijo: ${variable%suffix}

Cortar sufijo - hasta la última coincidencia de comodín sufijo: ${variable%%suffix}

Puede parecer poco claro a primera vista, vea el siguiente ejemplo:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

En el último ejemplo, el patrón no coincide, por lo que no se corta nada.


fuente
Sería más robusto de usar echo ${mytext#*:}:. Esto manejará correctamente líneas como (123)(434): hello::{apple,orange,mango}.y 123434: hello::{apple,orange,mango}.
drs
¿hay alguna forma de modificar el comando echo $ {mytext %% B *} para obtener texto después de B. en su ejemplo
user80538
@ user80538 sí, solo corte el texto antes de B, inclusive ;-), es decir: $ {mytext # * B} para el texto después de la primera B y $ {mytext ## * B} para el texto después de la segunda B.