如何使用Shell移除XML文件<age>标签中的隐藏换行符
解决XML中标签前隐藏换行符的问题
我来给你几个实用的命令,轻松搞定这个换行符问题:
方法1:用sed命令(最常用)
这个命令专门针对</name>后换行接<age>的场景,会把换行和<age>前的多余空白替换成单个空格,让<age>和前面内容归到同一行:
sed -i '/<\/name>$/{N;s/\n\s*<age>/ <age>/}' your_filename.xml
简单解释下:
/<\/name>$/:精准匹配以</name>结尾的行N:把下一行(也就是带<age>的那行)读入当前处理空间s/\n\s*<age>/ <age>/:把换行符+<age>前的任意空白,替换成单个空格加<age>
如果<age>前的换行可能出现在其他位置,试试全局替换的版本:
sed -i ':a;N;$!ba;s/\n\s*<age>/ <age>/g' your_filename.xml
它会扫描整个文件,把所有换行+任意空白+<age>的组合都改成空格+<age>。
方法2:用perl命令(更灵活)
perl处理多行文本替换特别顺手,这个命令会一次性读入整个文件,全局处理所有符合条件的换行:
perl -0777 -i -pe 's/\n\s*<age>/ <age>/g' your_filename.xml
-0777:让perl把整个文件当成一个完整字符串处理,忽略换行限制-i:直接修改原文件(想留备份的话用-i.bak,会生成带.bak后缀的备份文件)-pe:执行替换并输出结果
方法3:用awk命令(适合简单场景)
如果你的需求只是把<age>所在行和前一行合并,awk也能搞定:
awk 'NR>1 && /^<age>/ {printf " "} {printf "%s", $0}' your_filename.xml > temp.xml && mv temp.xml your_filename.xml
NR>1 && /^<age>/:如果不是第一行且行首是<age>,先打印一个空格{printf "%s", $0}:不换行输出当前行内容- 最后把结果写入临时文件再替换原文件,避免直接修改出问题
执行完任意一个命令后,再用cat -e your_filename.xml验证,就能看到<age>标签已经和前面的内容在同一行,变成你想要的格式啦!
内容的提问来源于stack exchange,提问作者Sen
相关产品推荐
相关产品推荐

