我在編寫 sed 命令時遇到問題,請執行以下操作。我有一個應該只包含「有效」網域的檔案。如何使用 sed 刪除任何與表達式不符的行?
以下內容似乎與我想保留在我使用的線上工具中的行相匹配,儘管我確信它可以寫得更好。
^*.*[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,15}?$
文件
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example
example.example.co.uk
(example)
example.photography
example.info
example/
example.
example</h1>
{example}
etc.
預期輸出:
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example.example.co.uk
example.photography
example.info
謝謝您的幫忙。
答案1
我必須修改您的正規表示式以使其有效,但此 sed 命令僅列印符合的行:
$ sed -nr '/[.].*[a-zA-Z0-9][a-zA-Z0-9-]+([.][a-zA-Z]{2,15})?$/p' file
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example.example.co.uk
example.photography
example.info
怎麼運作的
-n
這告訴 sed 不要列印一行,除非我們明確要求它列印。
-r
這告訴 sed 使用擴展正規表示式。
/[.].*[a-zA-Z0-9][a-zA-Z0-9-]+([.][a-zA-Z]{2,15})?$/p
/.../
選擇與正規表示式相符的行並/.../p
告訴 sed 列印與正規表示式相符的行。
正規表示式的更改
請注意,這^*
不是啟動正規表示式的有效方法。 ^
匹配行的開頭,並且*
會匹配零個或多個前面的字符,但沒有給出前面的字符。這可以透過新增句點來使其有效,如 中所示^.*
。它匹配以任何內容開頭的行。但是,由於這裡沒有幫助,所以我將其刪除。
另外,由於您似乎想排除以句點結尾的行,因此我更改\.[a-zA-Z]{2,15}?$
為([.][a-zA-Z]{2,15})?$
.
對於其他人嘗試使用正規表示式來匹配域名,請參閱,例如,使用 RegEx 進行網域驗證或者正規表示式匹配主域名。