使用sed替换文本并缩进数据

时间:2019-05-21 11:07:41

标签: bash sed replace text-processing

我有一个简单的xml文件,类似于:

<student>
</student>

我正在使用此sed命令:

    sed -i "s/<\/student>/  <name>${1}<\/name>\
      <age>${2}<\/age>\
<\/student>/g" pom.xml

使用以下命令用一些xml数据替换我的xml:

  

./ main.sh JohnDoe 12

,并根据命令行值将其打印为

<student>
  <name>JohnDoe</name>
  <age>12</age>
</student>

但是最终打印为

   <student>
     <name>JohnDoe</name>  <age>12</age>  </student>

所以我该如何使用sed整齐地格式化xml数据!

感谢您的提前帮助!

3 个答案:

答案 0 :(得分:1)

sed -i "s/<\/student>/  <name>${1}<\/name>\n  <age>${2}<\/age>\n<\/student>/g" pom.xml

请记住,不建议通过sed或awk解析xml,请在此处搜索parse xml bash

答案 1 :(得分:0)

解决这个问题几天后!我能够提出解决方案

#!/bin/bash

newLine=\\n

sed -i "s/<\/student>/  <name>${1}<\/name>${newLine}\
  <age>${2}<\/age>${newLine}\
<\/student>/g" pom.xml

创建新行\n变量并将其添加到每行的末尾即可。

答案 2 :(得分:-1)

XML是具有其语义的标记语言,不应使用sed之类的工具对其进行解析/操作。使用适当的XML / HTML解析器/处理器。

使用xmlstarlet工具:

示例test.xml内容:

<student>
</student>

test.sh 脚本内容:

#!/bin/bash

xmlstarlet ed -s "student" -t elem -n name -v "$1" -s "student" \
           -t elem -n age -v "$2" test.xml | xmlstarlet fo -o -

用法:

$ . test.sh John 35

输出:

<student>
  <name>John</name>
  <age>35</age>
</student>

文档链接:http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html#idm47077139594320