Ich bin neu sed
und 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
sed
verwendet standardmäßig POSIX Basic Regular Expressions (BRE). \s
ist 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, g
da 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 -r
Option, die dies ermöglicht.
Fügen Sie die Option -r
zum Ä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 cut
hierfü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