sed: Alles vom Punkt nach FQDN entfernen

sed: Alles vom Punkt nach FQDN entfernen

Ich bin neu sedund habe einige Probleme, es zum Laufen zu bringen.

Was ich will, ist Folgendes:

abc.ztx.com. A 132.123.12.44 ---> abc.ztx.com

Ich habe das folgende Muster verwendet, aber es scheint nicht zu funktionieren:

echo "abc.ztx.com. A 132.123.12.44" | sed 's/\.\s.+//g'

Ich habe den regulären Ausdruck mit regex101.com und Muster überprüft, \.\s.+passt perfekt zum Teil . A 132.123.12.44. Warum funktioniert es nicht mit sed.

Ich weiß Ihre Hilfe zu schätzen. Danke.

Antwort1

sedverwendet standardmäßig POSIX Basic Regular Expressions (BRE). \sist ein PCRE (Perl-kompatibler regulärer Ausdruck), der dem BRE entspricht [[:blank:]](ich glaube, er passt auf Leerzeichen und Tabulatoren oder [[:space:]]passt möglicherweise auf eine größere Anzahl von Leerzeichen). Dies ist ein POSIX Extended Regular Expression (ERE)-Modifikator, der einem BRE +entspricht .\{1,\}

Also versuche

sed 's/\.[[:blank:]].*//'

stattdessen. Sie können es [[:blank:]]durch ein Leerzeichen ersetzen, wenn Sie keine Tabulatoren benötigen:

sed 's/\. .*//'

Beachten Sie, dass die Ersetzung mit der Flagge nicht erforderlich ist, gda es immer nur eine einzige Übereinstimmung geben wird. Außerdem .+könnte das von Ihnen verwendete einfach durch .*anstelle von ersetzt werden .\{1,\}, da es uns egal ist, ob überhaupt weitere Zeichen vorhanden sind (löschen Sie einfach alle).

Verwandt:

Antwort2

Wenn Sie Gnu/Linux oder ein anderes Gnu verwenden, verfügen Sie über Gnu sed. Gnu sed bietet die -rOption, die dies ermöglicht.

Fügen Sie die Option -rzum Ändern des Dialekts des regulären Ausdrucks hinzu.

z.B

echo "abc.ztx.com. A 132.123.12.44" | sed -r 's/\.\s.+//g'

Antwort3

In Ihrer Frage geht es speziell um sed, aber ich würde cuthierfür verwenden.

Wenn Sie mit einem abschließenden Punkt leben können, dann:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1

abc.ztx.com.

Wenn Sie mit dem abschließenden Punkt nicht leben können, dann:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | rev | cut -d. -f2- | rev

abc.ztx.com

oder:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | sed -e "s/\.$//"

abc.ztx.com

Antwort4

Noch eine weitere Möglichkeit mit awk, wobei .(Punkt + Leerzeichen) als Feldtrenner angegeben ist:

echo "abc.ztx.com. A 132.123.12.44" | awk -F '\\. ' '{print $1}'

abc.ztx.com

verwandte Informationen