sed:删除 FQDN 之后的点中的所有内容

sed:删除 FQDN 之后的点中的所有内容

我是新手sed,并且在使其发挥作用时遇到了一些麻烦。

我想要的是这样的:

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

我使用了以下模式,但似乎不起作用:

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

我使用 regex101.com 和模式验证了正则表达式,\.\s.+与该部分. A 132.123.12.44完美匹配。为什么它不能与sed.

感谢你的帮助。谢谢。

答案1

sed默认情况下使用 POSIX 基本正则表达式 (BRE)。 \s是一个PCRE(与Perl兼容的正则表达式),它相当于BRE [[:blank:]](我认为,匹配空格和制表符,或者[[:space:]]匹配更大的空白字符集)。是+POSIX 扩展正则表达式 (ERE) 修饰符,相当于\{1,\}BRE。

所以尝试一下

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

反而。[[:blank:]]如果不需要匹配制表符,可以用空格字符替换:

sed 's/\. .*//'

请注意,无需使用标志进行替换,g因为只会有一个匹配项。另外,.+您使用的 可以替换为.*而不是 ,.\{1,\}因为我们根本不关心是否还有其他字符(只需删除所有字符)。

有关的:

答案2

如果您使用 Gnu/Linux 或任何其他 Gnu,那么您将拥有 Gnu sed。 Gnu sed 有一个-r选项,允许这样做。

-r添加更改正则表达式方言的选项。

例如

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

答案3

您的问题具体询问了sed,但我会用cut它来实现。

如果您可以接受尾随点,那么:

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

abc.ztx.com.

如果您不能忍受尾随点,那么:

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

abc.ztx.com

或者:

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

abc.ztx.com

答案4

另一种可能性是使用awk, 并将.(句点 + 空格)指定为字段分隔符:

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

abc.ztx.com

相关内容