使用sed替换动态文件名周围的文本

时间:2018-01-04 19:17:06

标签: bash sed

我试图找出在BASH脚本中替换文本的最佳方法。 Sed似乎是最好的选择,但如果我错了,请纠正我。

我想要做的是将images/< filename >.png中的每个实例都放在一个文件中,并添加周围的文字 - {{media("images/.< filename >.png")}}。以下代码是我能够获得的最接近的代码:

sed -i -e 's:images/.*.png:{{media("images/.*.png")}}:g' file.html

我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:2)

在sed中,替换中的&将替换为匹配的字符串,因此如果我们可以假定文件名中没有空格,并且每个字符串前后都有字边界,那么这就是你想要的:

s:\bimages/\S*\.png\b:{{media("&")}}:g

Try it online!

除了进行替换之外,您的代码还有一些值得一提的问题:

  1. images/.*.png将与images/foo.png匹配,但也会匹配images/foopng。不要忘记逃避正则表达式字符:images/.*\.png

  2. sed量词总是贪心的。假设你有这个输入:

    Foo images/bar.png baz images/qux.png quux
    

    在这种情况下,表达式images/.*\.png将匹配从第一个images到最后一个.png的所有内容。上述解决方案通过使用\S而非.来仅匹配非空白字符来避免这种情况。