答案1
鉴于您的示例,类似这样的操作应该有效:
$ cat ex
#multiline.pattern: ^\[
$ sed -e "s/^#multiline\.pattern:.*/multiline.pattern: '^\\\['/" ex
multiline.pattern: '^\['
#multiline.pattern:
这会将以 开头,后跟任意数量的字符到行尾的行替换为您所追求的模式。
您所追求的模式包括一些特殊符号(\
, [
),我用附加符号对其进行了转义\
(例如,\\
为您提供一个文字\
,
\[
为您提供一个文字[
)。
答案2
你可以解决这个问题:sed "s@\^@\'\^@;s/$/\'/"
$ cat > toto
#multiline.pattern: ^\[
$ sed "s@\^@\'\^@;s/$/\'/" toto
#multiline.pattern: '^\['
想法是在两个连续操作中用“行尾”替换“ ^
by '^
”,然后用“行尾”替换'
“行尾”,以简化正则表达式。
当然用sed -i ...
它修改文件
答案3
出错的地方是最后一部分的方式引:
sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g'
# ^ ^ ^ ?
最后一部分被backslash
转义,直到另一个单引号的末尾打开。这就是为什么bash
给出$PS2
提示>
,允许您输入更多内容,直到报价以另一个结束'
删除最后一个'
,它就会起作用:
sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g
# or:
sed 's/multiline.pattern: ^\\\[/multiline.pattern: '"'^\\\['/g"
sed "s/multiline.pattern: ^\\\\\[/multiline.pattern: '^\\\['/g"
sed 's/multiline.pattern: ^\\\[/multiline.pattern: \x27^\\[\x27/g'
还:
- 从您的示例输出来看,您似乎也想删除
#
。为此,请将其包含在匹配模式中sed
(使用您喜欢的引用样式):
sed 's/#multiline...'
- 可以使用括号来“捕获”匹配模式的部分,以便您可以在替换中重用这些部分(称为子表达式和反向引用):
sed -r 's/#(multiline\.pattern: )(\^\\\[)/\1'\'\\2\'/g
(使用-r
/--regexp-extended
不是必需的,但它更具可读性)
- 最好首先在不带/选项
sed
的情况下运行命令来检查命令是否按预期运行,以便可以检查输出是否有错误,而不是覆盖可能存在错误的文件。-i
--in-place