【问题标题】:sed replace filename starts with quotesed 替换文件名以引号开头
【发布时间】:2015-07-10 16:24:59
【问题描述】:

我在文件字符串中有 img src="../image/popup.jpg"bg: 'images/xxx/popup.png'。我想用另一个带有 sed 的字符串替换整个文件路径/名称,我试过了

sed 's/^"[^\s]*/somethingelse/g' 

【问题讨论】:

  • 我只知道文件名,但是路径需要正则匹配
  • 你能把双引号全局替换成单引号吗?文件名很难,因为它们可以包含转义引号。如果这是 html,那么您最好使用 html 解析器。或子图像/xxx 与其他东西.. 另见stackoverflow.com/questions/11794144/…

标签: regex linux string replace sed


【解决方案1】:

试试这个,

 sed 's|/some/UNIX/path|/a/new/path|g' files

【讨论】:

    【解决方案2】:

    当使用 sed 替换路径名时,更改其默认分隔符会有所帮助,正如 Skynet 所指出的,并且明智地使用单引号允许像这样的变量插值:

    > a="\"hello/bye\""
    > b="\"one/two\""
    > echo $a
    "hello/bye"
    > echo $b
    "one/two"
    > echo $a|sed -e 's|'$a'|'$b'|'
    "one/two"
    

    来自http://linux.die.net/man/1/sed sed 不支持 POSIX。 2个基本的正则表达式“完全是因为性能问题”,但是它很接近。根据http://www.regular-expressions.info/posix.html,POSIX 正则表达式的规则之一是“使用反斜杠转义绝不是元字符的字符是错误的”。由于双引号和单引号不是元字符,因此不应根据此在 POSIX 正则表达式中使用反斜杠。

    【讨论】:

      【解决方案3】:

      sed 与 BRE 一起使用:

      sed "s/\([\"']\)[^\"']*\([\"']\)/\1somethingelse\2/g" file
      

      使用 ERE:

      sed -r "s/([\"'])[^\"']*([\"'])/\1somethingelse\2/g" file
      

      假设文件名中没有转义引号,即 "..."'...' 中没有引号

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 2013-10-19
        • 1970-01-01
        • 2019-07-26
        • 2012-01-16
        • 1970-01-01
        相关资源
        最近更新 更多