sed + Cómo eliminar un solo carácter tras otro carácter en línea por sed

0

Cómo eliminar un solo carácter después de otro carácter en línea por sed

Por ejemplo

   LINE="ABCDE 123 |@ TEST"

Quiero eliminar el carácter @ solo si existe después de la primera "|" personaje en LINE

El comando sed verificará si: @ el carácter existe después de "|" , y si es verdadero, sed eliminará el carácter @

otro ejemplo

    LINE="qwe 123 >|@ sdf g"  (before sed action)

    LINE=="qwe 123 >| sdf g"  (after sed action)

Gracias

yael
fuente

Respuestas:

1
 % echo "ABCDE 123 |@ TEST" | sed 's,|@,|,'

Es esencialmente lo mismo que tu otra pregunta.

akira
fuente
0

Parece que haces muchas de estas preguntas. Sugiero que se familiarice con la expresión regular para comprender mejor las respuestas y encontrar sus propias soluciones. Regular-Expressions.info Es un buen punto para empezar.

Para escribir una expresión regular que coincida con las líneas que contienen su caso (es decir, AT después de PIPE), usaría

^.*?\|.*?@

aquí ^ significa el comienzo de la línea, .*? coincide con cualquier personaje, pero lo menos posible, @ es un literal @, y \| es un literal |, simplemente se escapó porque tiene un significado especial en expresiones regulares.

Para eliminar el signo de AT, debe indicar a remplazar toda la oración con todo menos el signo de AT. Para hacer esto, necesitas almacenar todo lo que quieras guardar. Las expresiones regulares manejan esto con grupos de captura. Llegas a

^(.*?\|.*?)@

El comando sed que buscas finalmente parece

sed -r 's/^(.*?|.*?)@/\1/'

El comando "s" significa sustituto, la expresión regular que hemos creado está entre el primer par de / (Con los brackets y la barra invertida escapando). El texto para reemplazar la coincidencia con es el \1 detrás de eso y representa el contenido del primer grupo de captura. Ya que no capturamos el AT, eso debería hacer el truco.

Espero haberte ayudado. Ya que no tengo ningún permiso aquí, esto puede o no funcionar sin modificaciones. =)

Jens
fuente
demasiado complicado, solo busque '| @' y reemplace la primera ocurrencia. no hay necesidad de hacer una referencia inversa de lo que sea antes o después de '| @', sed lo dejará solo de todos modos.
akira
Ah, gracias por la pista. =) En realidad rara vez uso sed. Sin embargo, mis soluciones reemplazan "| bla @" con "| bla". No sé si eso es lo que debería estar haciendo.
Jens
Tu orden final debe ser cualquiera sed 's/^\(.*\?\|.*\?\)@/\1/' o sed -r 's/^(.*?|.*?)@/\1/' (correcciones a la fuga)
Dennis Williamson
0

Lo sentimos, actualmente no puedo comentar sobre la solución de Jens.

Los patrones analizados en la solución de Jens no cumplen con el requisito de 'eliminar solo el carácter @ ... después de la primera "|" personaje'. Un patrón conforme sería:

sed 's/\(^[^|]|\)@/\1/'

Esto no modifica las líneas que tienen un PIPE adicional antes de la secuencia PIPE AT.

kdo
fuente