Comme les autres l'ont noté, grep
n'est pas bien adapté à cette tâche, sed
est une bonne option, ou si le texte est bien ordonné un simple cut
pourrait être plus facile à taper :
echo www.abc.com | cut -d. -f2-
-d.
indiquecut
utiliser.
comme délimiteur.-f2-
ditcut
pour ramener le champ 2 à l'infini.
avec le --only-matching
de grep et \K
Vous pouvez le faire avec le --only-matching
d'un grep drapeau :
echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'
qui peut être raccourci en
echo "www.abc.com" | grep -Po 'www.\K.*'
Les deux commandes produisent
abc.com
avec grep (GNU grep) 3.3.
Au lieu de echo
, je vais utiliser une chaîne ici pour raccourcir davantage la commande :
grep -Po 'www.\K.*' <<< "www.abc.com"
\K
réinitialise le point de départ du match, oubliant essentiellement le "www." correspondant. Voir ceci pour en savoir plus sur \K
.
avec le lookbehind positif de grep
Vous pouvez également le faire avec un lookbehind positif :
grep -Po '(?<=www.).*' <<< "www.abc.com"
avec le séparateur de champs d'awk -F
awk -F 'www.' <<< "www.abc.com" '$2{print $2}'
Ceci imprime
abc.com
Le $2{print $2}
part imprimera le deuxième champ s'il est défini. Ceci est nécessaire en cas d'entrée multi-lignes pour éviter de générer des lignes vides pour les lignes d'entrée qui ne contiennent pas de séparateur de champs.
Vous ne modifiez pas les chaînes avec grep
dans le shell Unix, grep
est généralement utilisé pour rechercher ou supprimer certaines lignes du texte. Vous préférez utiliser sed
à la place :
$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com
Vous devrez apprendre les expressions régulières pour les utiliser efficacement.
Sed peut également éditer le fichier sur place (modifier le fichier), si vous passez -i
argument, mais attention, vous pouvez facilement perdre des données si vous écrivez le mauvais sed
commandez et utilisez -i
drapeau.
Un exemple
D'après vos commentaires, vous avez un document TeX et vous souhaitez supprimer la première partie de tous les noms de domaine .com. S'il s'agit de votre document test.tex
:
\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}
alors vous pouvez le transformer avec ce sed
commande (rediriger la sortie vers un fichier ou modifier sur place avec -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}
Veuillez noter que :
- Une séquence courante de symboles autorisés suivis d'un point correspond à
[a-z0-9-]\+\.
- J'ai utilisé des groupes dans l'expression régulière (en partie dans
\(
et\)
) pour indiquer la première et la deuxième partie de l'URL, et je remplace la correspondance entière par son deuxième groupe (\2
dans le modèle de substitution) - Le domaine doit être au moins un domaine .com de 3e niveau (tous les
\+
répétition signifie au moins une correspondance) - La recherche est insensible à la casse (
i
drapeau à la fin) - Il peut faire plus que correspondre par ligne (
g
drapeau à la fin)
Vous pouvez le faire en utilisant grep
facilement :
$ echo www.google.com | grep -o '[^.]*\.com'
google.com
Au lieu de echo
vous devez donner votre dossier.
$ grep -o '[^.]*\.com$' < file
J'ai utilisé ici l'expression régulière '[^.]*.com'. Cela signifie :trouvez-moi un mot sans .
dedans ([^.]*
), après quoi va .com
(\.com
en ré). Le -o
la clé dit que grep
doit montrer uniquement la partie qui a été trouvée.