Sed Regexp 命令不起作用

Sed Regexp 命令不起作用

所以我在文件中有一行看起来像这样:

#multiline.pattern: ^\[

我尝试使用 sed 来替换它:

multiline.pattern: '^\['

我用来执行此操作的命令是:

sudo sed -i 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g' /etc/filename.txt

但每次我运行这个命令时我都会得到这个:

在此输入图像描述

有人可以告诉我我在这里做错了什么吗?

谢谢!

答案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

相关内容