我正试图在bash中使用sed
命令来使以下正则表达式起作用。
^[^<]?(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*))[^>]?$
我知道这个正则表达式是正确的,它的工作方式符合我的预期。因此,不需要帮助。我已在在线正则表达式测试器上测试过了,并且按照我的期望工作。
请在这里找到上述正则表达式的演示。
我的要求:我想将每个URL都包含在<>
中。如果URL已经被包含在其中,则像上面链接中所示将其附加到结果中。
示例输入:(在名为website.txt的文件中)
// List of all legal urls
https://www.google.com/
https://www.fakesite.co.in
https://www.fakesite.co.uk
<https://www.fakesite.co.uk>
<https://www.google.com/>
预期输出:(在名为output.txt的文件中)
<https://www.google.com/> // Please notice every url is enclosed in the <>.
<https://www.fakesite.co.in>
<https://www.fakesite.co.uk>
<https://www.fakesite.co.uk> // Please notice if the url is already enclosed in <> then it is appended as it is.
<https://www.google.com/>
我在 sed 中尝试的内容:
Since I'm not well-versed in bash commands; so previously I was not able to capture the group properly in
sed
but after reading this answer; I figured out that we need to escape the parenthesis to be able to capture it.Somewhere; I read that look-arounds are not supported in
sed
(GNU based) so I removed lookarounds too; but that also didn't worked. If it doesn't support look-arounds then I used this regex and it served my purpose.Then; this is my latest try with
sed
command:sed 's@^[^<]?(https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&/=]*))[^>]?$@<\1>@gm;t;d' websites.txt > output.txt
我的具体问题:
如何使上面的命令正常工作。如果您运行我在第3点中提供的示例命令,则会发现它未正确替换内容。它只是将websites.txt
的内容转储到output.txt
中。但是在上面的正则表达式演示中,它可以正常运行,即将所有未封闭的网站包含在<>
中。任何建议都将有所帮助。我更喜欢使用sed,但如果可能的话,上述命令是否也可以转换为awk?如果可能的话,请帮助我完成,我将不胜感激。谢谢。