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 acut
usar.
como delimitador.-f2-
le dice acut
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ó.