GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo eliminar un prefijo de palabra usando grep?

Como han señalado los demás, grep no es adecuado para esta tarea, sed es una buena opción, o si el texto está bien ordenado un simple cut podría ser más fácil escribir:

echo www.abc.com | cut -d. -f2-
  • -d. le dice a cut usar . como delimitador.
  • -f2- le dice a cut para devolver el campo 2 al infinito.

con --only-matching de grep y \K

Puedes hacer esto con un --only-matching de grep bandera:

echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'

que se puede acortar a

echo "www.abc.com" | grep -Po 'www.\K.*'

Ambos comandos producen

abc.com

con grep (GNU grep) 3.3.

En lugar de echo , usaré una cadena aquí para acortar aún más el comando:

grep -Po 'www.\K.*' <<< "www.abc.com"

\K restablece el punto de inicio del partido, esencialmente olvidando el "www." emparejado. Consulte esto para obtener más información sobre \K .

con la mirada positiva hacia atrás de grep

También puedes hacer esto con una mirada positiva hacia atrás:

grep -Po '(?<=www.).*' <<< "www.abc.com"

con el separador de campo de awk -F

awk -F 'www.' <<< "www.abc.com" '$2{print $2}'

Esto imprime

abc.com

El $2{print $2} part imprimirá el segundo campo si está definido. Esto es necesario en el caso de una entrada de varias líneas para evitar generar líneas en blanco para las líneas de entrada que no contienen el separador de campo.


No editas cadenas con grep en el shell de Unix, grep generalmente se usa para buscar o eliminar algunas líneas del texto. Prefieres usar sed en cambio:

$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com

Deberá aprender expresiones regulares para usarlo de manera efectiva.

Sed también puede editar el archivo en el lugar (modificar el archivo), si pasa -i argumento, pero tenga cuidado, puede perder datos fácilmente si escribe el sed incorrecto comando y uso -i bandera.

Un ejemplo

A partir de sus comentarios, supongo que tiene un documento TeX y desea eliminar la primera parte de todos los nombres de dominio .com. Si es su documento test.tex :

\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}

entonces puedes transformarlo con este sed comando (redirigir la salida al archivo o editar en el lugar con -i ):

$ sed 's/\([a-z0-9-]\+\.\)\(\([a-z0-9-]\+\.\)\+com\)/\2/gi' test.tex 
\documentclass{article}
\begin{document}
example.com
example.com another.domain.com
\end{document}

Tenga en cuenta que:

  • Una secuencia común de símbolos permitidos seguida de un punto coincide con [a-z0-9-]\+\.
  • Utilicé grupos en la expresión regular (partes de ella dentro de \( y \) ) para indicar la primera y la segunda parte de la URL, y reemplazo la coincidencia completa con su segundo grupo (\2 en el patrón de sustitución)
  • El dominio debe ser al menos un dominio .com de tercer nivel (cada \+ repetición significa al menos una coincidencia)
  • La búsqueda no distingue entre mayúsculas y minúsculas (i bandera al final)
  • Puede hacer más que coincidir por línea (g bandera al final)

Puedes hacer esto usando grep fácilmente:

$ echo www.google.com | grep -o '[^.]*\.com'
google.com

En lugar de echo debes dar tu archivo.

$ grep -o '[^.]*\.com$' < file

Usé aquí la expresión regular '[^.]*.com'. Eso significa:encuéntrame una palabra sin . en él ([^.]* ), después de lo cual va .com (\.com en re). El -o clave dice que grep debe mostrar solo la parte que se encontró.


Linux
  1. Cómo eliminar un usuario en Linux usando la línea de comandos

  2. ¿Cómo resaltar una palabra en la salida de "gato"?

  3. Cómo encontrar texto específico usando GREP en Linux

  4. Cómo eliminar archivos de más de N días usando tmpreaper en Linux

  5. ¿Cómo hago grep recursivamente?

Cómo eliminar directorios y archivos usando Linux

Cómo eliminar archivos y directorios usando la línea de comandos de Linux

Cómo realizar una búsqueda de patrones en archivos usando Grep

15 ejemplos del uso del comando Grep en Linux

Cómo quitar líneas de un archivo usando el comando Sed

Cómo eliminar un reenviador de correo electrónico mediante cPanel