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)
最后,作为一般规则,在使用正则表达式时,少即是多。您应该尝试指定最简单的排他模式,而不是重复所有文本。这不仅使您的代码更易于阅读,而且还避免了您面临的问题。例如:
sed -i -r 's/<!--(UpdateAccountGUIDs.+?)-->/<\1>/' File.XML
Run Code Online (Sandbox Code Playgroud)
在这里,-r启用扩展的正则表达式语法,因此我们可以()用来捕获一个组(无需转义括号),然后将捕获的文本引用为\1. 因此,上面的命令只是查找与 相邻的注释UpdateAccountGUIDs,扩展到注释语句的第一端,然后进行替换。