Come hanno notato gli altri, grep
non è adatto per questo compito, sed
è una buona opzione, o se il testo è ben ordinato un semplice cut
potrebbe essere più facile da digitare:
echo www.abc.com | cut -d. -f2-
-d.
dice acut
per usare.
come delimitatore.-f2-
dice acut
per riportare il campo 2 all'infinito.
con --only-matching
di grep e \K
Puoi farlo con un --only-matching
di grep bandiera:
echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'
che può essere abbreviato in
echo "www.abc.com" | grep -Po 'www.\K.*'
Entrambi i comandi producono
abc.com
con grep (GNU grep) 3.3.
Invece di echo
, userò una stringa here per abbreviare ulteriormente il comando:
grep -Po 'www.\K.*' <<< "www.abc.com"
\K
reimposta il punto di partenza della partita, dimenticando essenzialmente il "www." abbinato. Vedi questo per ulteriori informazioni su \K
.
con il lookbehind positivo di grep
Puoi farlo anche con un lookbehind positivo:
grep -Po '(?<=www.).*' <<< "www.abc.com"
con il separatore di campo di awk -F
awk -F 'www.' <<< "www.abc.com" '$2{print $2}'
Questo stampa
abc.com
Il $2{print $2}
part stamperà il secondo campo se è definito. Ciò è necessario in caso di input su più righe per evitare l'output di righe vuote per le righe di input che non contengono il separatore di campo.
Non modifichi le stringhe con grep
nella shell Unix, grep
viene solitamente utilizzato per trovare o rimuovere alcune righe dal testo. Preferiresti usare sed
invece:
$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com
Dovrai imparare le espressioni regolari per usarle in modo efficace.
Sed può anche modificare il file sul posto (modificare il file), se passi -i
argomento, ma fai attenzione, puoi facilmente perdere dati se scrivi sed
sbagliato comando e usa -i
bandiera.
Un esempio
Dai tuoi commenti supponi di avere un documento TeX e di voler rimuovere la prima parte di tutti i nomi di dominio .com. Se è il tuo documento test.tex
:
\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}
allora puoi trasformarlo con questo sed
comando (reindirizza l'output su file o modifica sul posto 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}
Tieni presente che:
- Una sequenza comune di simboli consentiti seguiti da un punto corrisponde a
[a-z0-9-]\+\.
- Ho usato i gruppi nell'espressione regolare (parti di essa all'interno di
\(
e\)
) per indicare la prima e la seconda parte dell'URL, e sostituisco l'intera corrispondenza con il suo secondo gruppo (\2
nel modello di sostituzione) - Il dominio deve essere almeno di 3° livello .com (ogni
\+
ripetizione significa almeno una corrispondenza) - La ricerca non fa distinzione tra maiuscole e minuscole (
i
flag alla fine) - Può fare di più che abbinare per riga (
g
flag alla fine)
Puoi farlo usando grep
facilmente:
$ echo www.google.com | grep -o '[^.]*\.com'
google.com
Invece di echo
devi dare il tuo file.
$ grep -o '[^.]*\.com$' < file
Ho usato qui l'espressione regolare '[^.]*.com'. Ciò significa:trovami una parola senza .
in esso ([^.]*
), dopo di che va .com
(\.com
in re). Il -o
key dice che grep
deve mostrare solo la parte che è stata trovata.