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