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. =)
sed 's/^\(.*\?\|.*\?\)@/\1/'
osed -r 's/^(.*?|.*?)@/\1/'
(correcciones a la fuga)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:
Esto no modifica las líneas que tienen un PIPE adicional antes de la secuencia PIPE AT.
fuente