使用sed有条件替换?

使用sed有条件替换?

我正在用sed替换url(\'test.png\')url(\'/navigation/test.png\')

使用此命令可以正常工作

sed -i "s#url(\\\'#url(\\\'/navigation/#g" "main.js"

/ 不过,我想排除已经以 a 开头的 url 语句url(\'/favicon.png\')

这可能吗sed

答案1

关键是在正则表达式中提供更多上下文:

sed -e "s#\\(url(\\\\'\\)\\(test.png\\\\')\\)#\1/navigation/\2#g"

另请注意:

  • 双引号内,'并不特殊。
  • 在双引号内,您需要编写\\一个\

答案2

您可以使用它[^/]来匹配除斜线之外的任何字符,并将其url(\'[^/]作为命令中的模式s。这当然会破坏你的第一个字符,所以你必须用它创建一个子表达式,这样你就可以在替换中\([^/]\)保留它:\1

sed -i "s#url(\\\'\\([^/]\\)#url(\\\'/navigation/\\1#g" "main.js"

另一种尝试是始终替换,但如果已经有斜杠则恢复:

sed -i "s#url(\\\'#url(\\\'/navigation/#g;s#navigation//##g" "main.js"

相关内容