sed 对我的替换字符串感到困惑

sed 对我的替换字符串感到困惑

我需要在文件 /opt/google/chrome/google-chrome 中更改一行

exec -a "$0" "$HERE/chrome" "$@"

exec -a "$0" "$HERE/chrome" "$@" --test-type --no-sandbox

所以我的命令是:

sed -i 's/exec -a "$0" "$HERE/chrome" "$@"/exec -a "$0" "$HERE/chrome" "$@" --test-type --no-sandbox/' /opt/google/chrome/google-chrome

返回:

sed:-e 表达式 #1,字符 37:'s' 的未知选项

我搜索后发现命令中的字符容易引起混淆,但我似乎找不到答案,不知道是哪些字符,也不知道该如何正确形成。有人能帮我把命令编辑成正确的语法吗?

答案1

而不是s/pattern/replace/使用类似的s!pattern!replace!(或者如果您不喜欢,可以使用不同的字符!)——这是因为模式和替换字符串都包含该/字符。

您的 sed 命令是

s/exec -a "$0" "$HERE/chrome" "$@"/exec -a "$0" "$HERE/chrome" "$@" --test-type --no-sandbox/
  • 模式是exec -a "$0" "$HERE
  • 替代品是chrome" "$@"
  • 然后标志(s/re/repl/flags)是exec
    • 有一个e标志,但是x无法c识别。

还要注意,$在循环表达式中是一个特殊字符,需要进行转义。

尝试这个:

s!exec -a "\$0" "\$HERE/chrome" "\$@"!&  --test-type --no-sandbox!
  • &替换字符串中的内容将被替换为与模式匹配的文本

或者,对于与“exec ... chrome ...”匹配的行,将标志添加到行末尾:

\!exec -a "\$0" "\$HERE/chrome" "\$@"! s/$/ --test-type --no-sandbox/

答案2

是的,谢谢。对我有用的是:

sed -i 's!exec -a "$0" "$HERE/chrome" "$@"!exec -a "$0" "$HERE/chrome" "$@" --test-type --no-sandbox'! /opt/google/chrome/google-chrome

相关内容