Bash 替换shell脚本中的XML标记值

Bash 替换shell脚本中的XML标记值,bash,shell,awk,sed,grep,Bash,Shell,Awk,Sed,Grep,嗨,我是这样一个xml文件 <parameter name="END_DATE">20181031</parameter> dt=$(awk -F '[<>]' '/_DATE/{print $3}' test.xml) newdt=20181108 现在我需要将这个值替换为提取的值 如果您的系统中没有xmlstarlet,则Chepner认为awk或sed不是用于xml的精确工具,我们将不胜感激。尽管Chepner是正确的,但请尝试以下操作 ech

嗨,我是这样一个xml文件

  <parameter name="END_DATE">20181031</parameter>
dt=$(awk -F '[<>]' '/_DATE/{print $3}' test.xml)
newdt=20181108
现在我需要将这个值替换为提取的值


如果您的系统中没有
xmlstarlet
,则Chepner认为
awk
sed
不是用于xml的精确工具,我们将不胜感激。

尽管Chepner是正确的,但请尝试以下操作

echo $newdt
20181108
awk -v dat="$newdt" 'match($0,/>[0-9]+</){$0=substr($0,1,RSTART) dat substr($0,RSTART+RLENGTH-1)} 1' Input_file
echo$newdt
20181108
awk-v dat=“$newdt””匹配($0,/>[0-9]+,如果sed适合您-

sed -Ei 's/( name="END_DATE")>20181031</\1>20181108</' test.xml

sed-Ei的/(name=“END_DATE”)>2018103120181108使用像
xmllint
这样的工具来处理XML,而不是
awk
(或
sed
,或任何标准的面向行的工具)。根据@chepner的评论,最好使用特定于XML的工具。例如,使用以下命令:
newdt=$(xmlstarlet sel-t-c)“//参数[@name='END\u DATE']/text()”test.xml)
使用
awk
sed
需要非常精确的XML序列化知识。这将用这个新日期替换任何/每个数字字段,尽管我同意提问者是模棱两可的。@GemTaylor,同意,如果OP进一步澄清问题,我可以为其添加更多条件。
sed -Ei "s/( name=\"END_DATE\")>20181031</\1>$newdt</" test.xml