使用 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 进行域名验证或者正则表达式匹配主域名

相关内容