使用 Bash 进行查找和替换

使用 Bash 进行查找和替换

我正在尝试用配置文件中的其他文本替换某些文本。我使用该sed命令创建了一个脚本,但出现了错误。

原文:

<property name="encryptData">false</property>

新队:

<property name="encryptData">true</property>

命令:

sed -i -e 's/<property name="encryptData">false</property>/<property name="encryptData">true</property>/g' /Users/User/Desktop/mirth.cfg

错误:

sed: 1: "s/<property name="encry ...": bad flag in substitute command: '<'

答案1

该命令几乎完美。您的问题是需要在斜杠前面加上</property>反斜杠,\就像这样。

sed -i -e 's/<property name="encryptData">false<\/property>/<property name="encryptData">true<\/property>/g' /Users/User/Desktop/mirth.cfg

我观察到我对这两次事件都做了同样的事。

这样 sed 就会知道这个斜线是流的一部分而不是命令“s”的一部分。

希望这能解决您的问题。

答案2

由于您要查找的模式包含/,请更改替换命令语法的分隔符sed。例如,您可以使用_,也可以使用模式分组,以便在替换中使用反向引用:

sed -r 's_(<property name="encryptData">)false(</property>)_\1true\2_' /Users/User/Desktop/mirth.cfg

另外,在使用该选项时进行备份总是一个好主意-i

sed -ri.bak 's_(<property name="encryptData">)false(</property>)_\1true\2_' /Users/User/Desktop/mirth.cfg

现在原始文件将保留为/Users/User/Desktop/mirth.cfg.bak,而修改后的文件将是/Users/User/Desktop/mirth.cfg

相关内容