Shell
使用 awk 或 sed 刪除子域
如何刪除文本文件中的所有子域?我想我需要刪除之前的所有內容,包括“。”?
輸入:
unix.stackexchange.com www.example.org example.example.tld
預期輸出:
stackexchange.com example.org example.tld
編輯:
沒有子域的域應該保持不變。只有當它有一個子域時,才應該觸及整個域。換句話說,兩個“.”或更多。
google.com 必須保持 google.com 輸入:
google.com mail.google.com
預期輸出:
google.com google.com
樣本數據
www.google.com prep.ai.mit.edu
保留最後兩個頂級域名,
使用
sed
sed 's/.*\.\(.*\..*\)/\1/'
在哪裡
.*\.
貪婪匹配任何字元(包括點)和點\( \)
記住匹配的字元串.*\..*
any char(1) 多次,一個點 any char 多次- (1) 由於上面的貪心,不會匹配 dot 。
\1
回憶第一個記住的字元串使用(gnu)
grep
grep -Eo '[^.]*.[^.]*$' data google.com mit.edu
- 正則表達式模式 (
[^.]*.[^.]*$
) 主要與上面的內容相同,除了$
哪個錨點位於行尾。刪除第一個子域,使用
sed
(留作資訊,規範已更改)sed -e 's/^[^.]*\.//' data google.com ai.mit.edu
在哪裡
^[^.]*\.
讀作^
行首,[^.]
而不是一個.
,*
多次,\.
一個點- 取而代之的是什麼。
- 如評論中所述,
sed
可以縮短為's/[^.]*.//'
(前提是行不以 dot 開頭)。
如果要剝離第一個子域:
cut -d . -f 2- input
如果您有多個級別的子域,
sub2.sub1.domain.com
您可以cut
結合使用rev
來保留域的最後兩個元素:rev input | cut -d . -f -2 | rev