使用 Sed 搜索和替换 XML 文件中的文本

Sha*_*ker 6 command-line sed text-processing

我有以下文字File.XML

<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->
Run Code Online (Sandbox Code Playgroud)

我想用

<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>
Run Code Online (Sandbox Code Playgroud)

我试过:

$ sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>/' File.XML
Run Code Online (Sandbox Code Playgroud)

但是得到这个错误:

sed: -e expression #1, char 63: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

ter*_*don 11

问题是您的搜索模式包含/您用作替换分隔符的内容,您需要为此使用另一个字符或转义/

sed -i 's#<!--UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs-->#<UpdateAccountGUIDs>UpdateAndExit</UpdateAccountGUIDs>#' File.XML
Run Code Online (Sandbox Code Playgroud)

或者

sed -i 's/<!--UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs-->/<UpdateAccountGUIDs>UpdateAndExit<\/UpdateAccountGUIDs>/' File.XML
Run Code Online (Sandbox Code Playgroud)

请注意,永远不要使用正则表达式来解析 [X]HTML

最后,作为一般规则,在使用正则表达式时,少即是多。您应该尝试指定最简单的排他模式,而不是重复所有文本。这不仅使您的代码更易于阅读,而且还避免了您面临的问题。例如:

sed -i -r 's/<!--(UpdateAccountGUIDs.+?)-->/<\1>/' File.XML
Run Code Online (Sandbox Code Playgroud)

在这里,-r启用扩展的正则表达式语法,因此我们可以()用来捕获一个组(无需转义括号),然后将捕获的文本引用为\1. 因此,上面的命令只是查找与 相邻的注释UpdateAccountGUIDs,扩展到注释语句的第一端,然后进行替换。