我正在尝试使以下正则表达式sed在 bash中的命令中工作。
^[^<]?(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*))[^>]?$
Run Code Online (Sandbox Code Playgroud)
我知道正则表达式是正确的,并且按我的预期工作。所以; 不需要帮助。我在在线正则表达式测试器上对其进行了测试,它按我的预期工作。
我的要求:
我想将每个 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/>
Run Code Online (Sandbox Code Playgroud)
预期输出:(在名为 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/>
Run Code Online (Sandbox Code Playgroud)
我在 sed 中尝试过的:
由于我不精通 bash 命令;所以以前我无法正确捕获该组,sed但在阅读此答案后;我发现我们需要转义括号才能捕获它。
某处; 我读到sed(基于 GNU 的)不支持环视,所以我也删除了环视;但这也不起作用。如果它不支持环视,那么我使用了这个正则表达式,它达到了我的目的。
然后; 这是我对sed命令的最新尝试:
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
Run Code Online (Sandbox Code Playgroud)
我的确切问题:
如何使上述命令正常工作。如果您将运行我在上面第 3 点中附加的命令示例;你会看到它没有正确替换内容。它只是转储websites.txtto的内容output.txt。但是在正则表达式演示中;附在上面它工作正常,即把所有未封闭的网站都放在里面<>。任何的意见都将会有帮助。我最好在 sed 中使用它,但如果可能的话,我也可以在 awk 中转换上述命令吗?如果你能,也请帮我解决这个问题;我将非常感激。谢谢
小智 4
经过很长时间的工作后,我让 sed 命令开始工作。下面是有效的命令。
sed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&=]*))[^>]?$@<\1>@gm;t' websites.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到该命令的示例实现。
因为,正则表达式已经满足了我为其编写此要求的人的要求;我只需要获得有关命令语法的帮助(尽管我们衷心欢迎任何改进);我希望该命令使用相同的正则表达式模式。
我以前不知道但现在了解到的事情:
我对国旗一无所知-E。现在我明白了; 使用-EPOSIX“扩展”语法(“ERE”)。感谢@GordonDavisson和@Sundeep。进一步阅读。
我不清楚 sed 不支持环视。但现在我知道 sed 不支持环视。感谢@dmitri-chubarov。进一步阅读
我不知道 sed 也不支持非捕获组。感谢@Sundeep解决了这部分。进一步阅读
我不知道 GNU sed 作为一个特定的命令行工具。感谢@oguzismail 的帮助。进一步阅读。