我在编写 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 进行域名验证或者正则表达式匹配主域名。