我是新手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