1 votos

¿Cómo eliminar todo entre dos personajes con SED?

¿Cómo se puede eliminar todo el texto ENTRE dos Personajes con sed...

Por ejemplo:

00arbez+15611@hotmail.com
00aryapan+kee45j@rediffmail.com
asghrsha+hfcdedd@yahoo.com

Quiero quitar el texto + a @ en el correo electrónico. (Incluso el + debe ser eliminado, y el símbolo @ necesidades para retener)

He utilizado el siguiente comando:

sed -e 's/\(+\).*\(@\)/\1\2/' FILE.txt > RESULT.txt

Pero la salida de el archivo incluye el signo "+" en ella. Por ejemplo: asghrsha+@yahoo.com

Quiero el siguiente resultado:

00arbez@hotmail.com
00aryapan@rediffmail.com
asghrsha@yahoo.com

Alguien me puede ayudar con la modificación de la anterior comando sed?

4voto

Kamil Maciorowski Puntos 897

Voy a empezar con el comando original en lugar de construir desde cero. La construcción desde cero es un excelente enfoque en este caso, todavía no hay un valor educativo en la comprensión de la original de comandos y los pasos que puede tomar para ajustar el mando a sus necesidades.

El núcleo de la original de comandos:

sed -e 's/\(+\).*\(@\)/\1\2/'

La expresión es en un formulario s/pattern/replacement/, lo que significa que para buscar " pattern y reemplazarlo con replacement". / es el separador de aquí.

Su pattern es \(+\).*\(@\). Su correspondiente función sería la misma si era +.*@ (adjuntando algo en \( \) es relevante en el contexto de la replacement, vamos a llegar a ella). Un patrón de +.*@ significa "literal + , seguido por (casi) cualquier carácter (.) repetido cero o más veces (*), seguido por el literal @".

Nota + corresponde a los primeros posible + y * es codicioso por lo que este partido se extiende desde el primer + a la última @. Puede que no te importa en tu caso concreto, aún que a veces es muy importante.

Su reemplazo es \1\2. Significa "lo que fue igualada por el 1 \( \) , seguido por lo que fue igualada por el 2do \( \)". Su primera \( \) en realidad \(+\), que coincide + desea deshacerse de.

Para dejarlo claro: la razón de que estos \( \) grupos aparecen en el patrón (de modo que el patrón no es sólo +.*@) se definen los fragmentos que se refiere como \1 y \2 más tarde.

Así que si usted no desea + a imprimir, el mínimo cambio en su comando original será para omitir \1, debido a que esta es la parte exacta que imprime + en su caso.

sed -e 's/\(+\).*\(@\)/\2/'

Pero entonces usted no necesita \( \) de todo + en el patrón, por lo tanto, usted puede simplificar:

sed -e 's/+.*\(@\)/\1/'

Nota \2 se convirtió \1 porque \(@\) es ahora el 1 \( \) grupo. También, ya que sólo puede coincidir @, puede utilizar el literal @ en lugar de \1:

sed -e 's/+.*\(@\)/@/'

Pero ahora usted no necesita \( \) en todo. El comando es:

sed -e 's/+.*@/@/'

A continuación, recordar * es codicioso por lo .* pueden incluir (extra) + o/y @. Supongamos que no queremos esto. Necesita activar . en algo que coincide con nada pero @ o +:

sed -e 's/+[^@+]*@/@/'

Esto es exactamente lo que esta otra respuesta que le dio. Con algo de experiencia en sed usuario crear esta solución desde cero. Como puede ver, es posible reducir el comando original, paso a paso de una manera lógica, y llegar a la misma solución.

3voto

Inno Puntos 951

La solución es simple para que coincida con la(s) que desea mantener en torno a los límites del partido, y ponerlos de nuevo con nada entre ellos.

sed 's/+[^@+]*@/@/' FILE.txt >RESULT.txt

Usted era poner de nuevo las cosas que usted no desea conservar, lo que obviamente produce un resultado erróneo.

Usted puede capturar la cadena desea seguir utilizando \( ... \) de agrupación entre paréntesis, pero en este caso, ya que es totalmente una cadena estática, he optado por mantener la expresión regular y la cadena de reemplazo tan simple como sea posible, y sólo codificar @ como la cadena de reemplazo.

Nótese también cómo el regex toma cuidado de no sentarse a horcajadas a través de varios signos más o @ signos. Tal vez usted no quiere sentarse a horcajadas sobre cualquier repetido + personajes realidad; luego sacar el plus de la negaba el carácter de clase, dejando sólo [^@].

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: