代码之家  ›  专栏  ›  技术社区  ›  IAspireToBeGladOS

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

  •  0
  • IAspireToBeGladOS  · 技术社区  · 7 年前

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

    我想做的是 images/< filename >.png 在文件中,并添加周围的文本- {{media("images/.< filename >.png")}} . 以下代码是我所能获得的最接近的代码:

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

    我怎样才能做到这一点?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jordan Running    7 年前

    在sed中, & 将替换为匹配的字符串,因此如果我们可以假设文件名和单词边界中没有空格,那么这就是您想要的:

    预打印覆盖:。png\b:{{媒体(“&”)}}}:g级

    联机试用

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

    1. <代码>图像/*。png将匹配图像/foo。png,但它也将匹配图像/foopng。不要忘记转义正则表达式字符:<代码>图像/*\。png

    2. sed量词总是贪婪的。假设您有以下输入:

      Foo图像/bar。png baz图像/qux。png quux
      
      
      

      在本例中,表达式为<代码>图像/*\。png将匹配从第一张图像到最后一张图像的所有内容。png。上述解决方案通过使用\S而不是来避免这种情况仅匹配非空白字符

    在线试用!

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

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

    2. sed量词总是贪婪的。假设您有以下输入:

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

      在本例中,表达式 图像/*\。巴布亚新几内亚 从一开始就匹配 images 直到最后 .png . 上述解决方案通过使用 \S 而不是 . 仅匹配非空白字符。