Wie die anderen angemerkt haben, grep
ist für diese Aufgabe nicht gut geeignet, sed
ist eine gute Option, oder wenn der Text gut geordnet ist, ein einfaches cut
könnte einfacher zu tippen sein:
echo www.abc.com | cut -d. -f2-
-d.
sagtcut
um.
zu verwenden als Trennzeichen.-f2-
sagtcut
um Feld 2 auf unendlich zurückzusetzen.
mit --only-matching
von grep und \K
Sie können dies mit --only-matching
eines grep tun Flagge:
echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'
was abgekürzt werden kann zu
echo "www.abc.com" | grep -Po 'www.\K.*'
Beide Befehle erzeugen
abc.com
mit grep (GNU grep) 3.3.
Statt echo
, verwende ich einen Here-String, um den Befehl weiter zu verkürzen:
grep -Po 'www.\K.*' <<< "www.abc.com"
\K
setzt den Startpunkt der Übereinstimmung zurück und vergisst im Wesentlichen das übereinstimmende "www.". Weitere Informationen finden Sie unter \K
.
mit dem positiven Lookbehind von grep
Sie können dies auch mit einem positiven Lookbehind tun:
grep -Po '(?<=www.).*' <<< "www.abc.com"
mit awks Feldtrennzeichen -F
awk -F 'www.' <<< "www.abc.com" '$2{print $2}'
Dies wird gedruckt
abc.com
Die $2{print $2}
part druckt das zweite Feld, wenn es definiert ist. Dies ist bei mehrzeiliger Eingabe notwendig, um zu vermeiden, dass Leerzeilen für Eingabezeilen ausgegeben werden, die das Feldtrennzeichen nicht enthalten.
Sie bearbeiten keine Zeichenfolgen mit grep
in der Unix-Shell grep
wird normalerweise verwendet, um einige Zeilen aus dem Text zu finden oder zu entfernen. Verwenden Sie lieber sed
stattdessen:
$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com
Sie müssen reguläre Ausdrücke lernen, um sie effektiv zu verwenden.
Sed kann die Datei auch direkt bearbeiten (die Datei ändern), wenn Sie -i
übergeben Argument, aber seien Sie vorsichtig, Sie können leicht Daten verlieren, wenn Sie sed
falsch schreiben Befehl und verwenden Sie -i
Flagge.
Ein Beispiel
Aus Ihren Kommentaren geht hervor, dass Sie ein TeX-Dokument haben und den ersten Teil aller .com-Domänennamen entfernen möchten. Wenn es Ihr Dokument ist test.tex
:
\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}
dann können Sie es mit diesem sed
umwandeln Befehl (Ausgabe in Datei umleiten oder direkt mit -i
bearbeiten ):
$ 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}
Bitte beachten Sie Folgendes:
- Eine übliche Folge zulässiger Symbole gefolgt von einem Punkt entspricht
[a-z0-9-]\+\.
- Ich habe Gruppen im regulären Ausdruck verwendet (Teile davon in
\(
und\)
), um den ersten und den zweiten Teil der URL anzugeben, und ich ersetze die gesamte Übereinstimmung durch die zweite Gruppe (\2
im Substitutionsmuster) - Die Domain sollte mindestens eine .com-Domain der 3. Ebene sein (jede
\+
Wiederholung bedeutet mindestens eine Übereinstimmung) - Bei der Suche wird die Groß-/Kleinschreibung nicht beachtet (
i
Flagge am Ende) - Es kann mehr als nur Übereinstimmungen pro Zeile (
g
Flagge am Ende)
Sie können dies mit grep
tun ganz einfach:
$ echo www.google.com | grep -o '[^.]*\.com'
google.com
Statt echo
Sie müssen Ihre Datei angeben.
$ grep -o '[^.]*\.com$' < file
Ich habe hier den regulären Ausdruck '[^.]*.com' verwendet. Das heißt:finde mir ein Wort ohne .
darin ([^.]*
), danach folgt .com
(\.com
im Bezug). Der -o
Schlüssel sagt, dass grep
muss nur den Teil anzeigen, der gefunden wurde.