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

Replace text and indent the data using sed

我有一个简单的 xml 文件,有点像:

<student>
</student>

我正在使用这个 sed 命令:

    sed -i "s/<\/student>/  <name><\/name>\
      <age><\/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 数据!!

提前感谢您的帮助!!

XML是一种标记语言,它的语义不应该是parsed/manipulated和sed这样的工具。使用合适的 XML/HTML parsers/processors.

使用xmlstarlet工具:

样本test.xml内容:

<student>
</student>

test.sh脚本内容:

#!/bin/bash

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

用法:

$ . test.sh John 35

输出:

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

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

sed -i "s/<\/student>/  <name><\/name>\n  <age><\/age>\n<\/student>/g" pom.xml

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

在解决这个问题几天后!!我想出了一个解决方案

#!/bin/bash

newLine=\n

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

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