【问题标题】:replace XML tags value in shell script替换 shell 脚本中的 XML 标记值
【发布时间】:2018-11-08 23:17:52
【问题描述】:

你好,我是这样的 xml 文件。

  <parameter name="END_DATE">20181031</parameter>

我想将此标签值替换为我尝试过的其他值。

dt=$(awk -F '[<>]' '/_DATE/{print $3}' test.xml)

我提取了标签值。

我有另一个像这样的变量值。

newdt=20181108

现在我需要将此值替换为提取的值。

任何帮助将不胜感激。

【问题讨论】:

  • 使用xmllint 之类的工具来处理XML,而不是awk(或sed,或任何标准的面向行的工具。)
  • 根据@chepner 的评论,最好使用特定于 XML 的工具。例如使用xmlstarlet,您将运行以下命令:newdt=$(xmlstarlet sel -t -c "//parameter[@name='END_DATE']/text()" test.xml)
  • awk 或 sed 的使用需要非常精确地了解用于 XML 的确切序列化。

标签: bash shell awk sed grep


【解决方案1】:

虽然 Chepner 是正确的,awk 或 sed 不是 xml 的确切工具,但如果您的系统中没有 xmlstarlet,请尝试以下操作。

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

【讨论】:

  • 这将用这个新日期替换任何/每个数字字段,尽管我同意提问者模棱两可。
  • @GemTaylor,同意,如果 OP 进一步澄清问题,我可以为其添加更多条件。
【解决方案2】:

如果 sed 适合你 -

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

不过,xml 解析器可能是一个更好的主意。

如果需要嵌入变量-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2012-09-13
    • 2023-03-28
    • 1970-01-01
    • 2012-01-30
    • 2017-10-13
    • 2013-11-19
    相关资源
    最近更新 更多