我试图找出在BASH脚本中替换文本的最佳方法。 Sed似乎是最好的选择,但如果我错了,请纠正我。
我想要做的是将images/< filename >.png
中的每个实例都放在一个文件中,并添加周围的文字 - {{media("images/.< filename >.png")}}
。以下代码是我能够获得的最接近的代码:
sed -i -e 's:images/.*.png:{{media("images/.*.png")}}:g' file.html
我怎样才能实现这一目标?
答案 0 :(得分:2)
在sed中,替换中的&
将替换为匹配的字符串,因此如果我们可以假定文件名中没有空格,并且每个字符串前后都有字边界,那么这就是你想要的:
s:\bimages/\S*\.png\b:{{media("&")}}:g
除了进行替换之外,您的代码还有一些值得一提的问题:
images/.*.png
将与images/foo.png
匹配,但也会匹配images/foopng
。不要忘记逃避正则表达式字符:images/.*\.png
。
sed量词总是贪心的。假设你有这个输入:
Foo images/bar.png baz images/qux.png quux
在这种情况下,表达式images/.*\.png
将匹配从第一个images
到最后一个.png
的所有内容。上述解决方案通过使用\S
而非.
来仅匹配非空白字符来避免这种情况。