Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed替换XML中匹配后的整行_Xml_Bash_Sed - Fatal编程技术网

Sed替换XML中匹配后的整行

Sed替换XML中匹配后的整行,xml,bash,sed,Xml,Bash,Sed,我想在识别正确的标记后替换XML中的一行 接受 我想换一个 安得烈 具有 鲍勃 其中Bob存储在$nameVariable中 使用sed sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g' 这可能是由于缺少转义字符而失败的,我尝试将其放置在不同的位置,但似乎没有正确地设置它们。 非常感谢您的帮助。sed不是编辑XML的好工具。无论采用哪种方式,如果换行符出现在错误

我想在识别正确的标记后替换XML中的一行

接受

我想换一个 安得烈 具有 鲍勃

其中Bob存储在$nameVariable中

使用sed

sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g'
这可能是由于缺少转义字符而失败的,我尝试将其放置在不同的位置,但似乎没有正确地设置它们。
非常感谢您的帮助。

sed不是编辑XML的好工具。无论采用哪种方式,如果换行符出现在错误的位置,或者有空标记,或者有嵌套标记,或者在无数其他情况下,它都会中断

使用正确解析XML的工具。例如,使用xmlstarlet:

xmlstarlet ed -u '/root/My_Name' -v "$nameVariable" filename.xml
此awk可用于:

awk -v name="$nameVariable" '/<My_Name>/{sub(/>.*</,">"name"<")}1' file
<root>
    <My_Name>Bob</My_Name>
    <My_Age>94</My_Age>
</root>
您可以对其进行一些更改,以便不需要两次文本:

sed  -i -r "s|(<My_Name>).*(</My_Name>)|\1$nameVariable\2|g" file
-r所以我不需要逃避。
将/替换为|,这样就不需要转义/了。

不要使用正则表达式来处理XML。使用适当的XML处理工具。例如,我使用:

剧本:

open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;
调用:

xsh script.xsh "$nameVariable"

谢谢你的回答!尽管如此,脚本仍将在多台机器上运行,sed是可以使用的工具,而其他工具不能强制使用。但是,原始XML的格式将严格执行,并承担风险。使用双引号展开变量并转义/,请参阅我的post.spot on,这正是我想要的!谢谢大家!@马蒂,不客气。更新了一些帖子。
open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;
xsh script.xsh "$nameVariable"