regex - 替换html参数中的模式
问题描述
我想换这个
href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf"
和
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"
- 这只是我正在使用的一个大文件的伪代码,所以我不能手动完成。
- 一切都在 1 行,所以我相信我能使用的只是替代命令
- 这甚至可以用 sed 吗?
我试过了
sed '/href/s#//noname.com.*(armada|family)?#//noname.com/arid#g' < list.html > list2.html
但什么都没有被替换....?
我正在使用 GNU sed 4.7 版
解决方案
对于GNU sed
:
$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#//noname.com/(basil/armada|family)#//noname.com/arid#g'
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"
在这种情况下,您可以使用-E
或。-r
(-E
跨系统更兼容)
你也忘了basil/
......
检查sed --help
或man sed
更多。
更新,这样怎么样:
$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href="..noname.com/s#(armada|family)#arid#g'
href="//noname.com/basil/arid/joke.pdf" href="//noname.com/arid/hello.pdf"
您可以更改为..
以\/\/
确保准确性。
如果您不想保留该basil
部分...由于正则表达式的贪婪模式,
您在评论中的命令只留下一个 url ,请检查:
$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#href....noname.com/(.*)(armada|family).*#\1#g'
basil/armada/joke.pdf" href="//noname.com/
可以看到,.*
实际捕获的 firstbasil
到next family
之前。
所以我们需要找到一种方法来阻止正则表达式过于贪婪,例如:
$ echo 'href="//noname.com/basil/armada/joke.pdf" href="//noname.com/family/hello.pdf" ' | sed -r '/href/s#//noname.com/[^.]*(armada|family)#//noname.com/arid#g'
href="//noname.com/arid/joke.pdf" href="//noname.com/arid/hello.pdf"
[^.]
表示任何不是 a 的字符,.
在这种情况下是为了避免正则表达式匹配超出.
before pdf
,作为停止标记。
在其他情况下,您可能需要找到另一个锚点。在这里
查看更多。
推荐阅读
- emacs - 如何禁用 Emacs Lisp 自动重新格式化?
- scala - 由于类型不匹配,Json4s 自定义序列化程序不起作用
- angular - 如何导航到位于主路由器插座中显示的组件中的辅助路由器插座?
- android - 我的按钮的透明度不起作用。我也在尝试添加边框
- c# - 如何避免在 WPF 中覆盖窗口范围的样式?
- python - 如何将以下 c++ 代码转换为 python
- microservices - 为什么消费者必须在尤里卡服务器上注册?
- sql-server - 以后出现错误时,看不到预期的 PRINT 或 RAISERROR 输出
- python - (Django,Python)如何修复 json.decoder.JSONDecodeError?
- ios - WKWebView 中的蒙版图像受 CORS 限制