使用 Sed 刪除無效域名

使用 Sed 刪除無效域名

我在編寫 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 進行網域驗證或者正規表示式匹配主域名

相關內容