You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多XML文件提取值并逐行写入文件的Grep命令优化问题

解决XML提取值逐行输出的问题

嘿,我明白你现在的困扰——用了一堆命令结果所有值都挤在一行,确实头疼!咱们来一步步把这个问题搞定。

首先,你的原命令最后那个awk是罪魁祸首:它用printf $i " "把所有字段用空格连起来输出,而且没加换行符,自然就全堆在一行了。咱们可以用几种简单的方式修正:

方案1:修正原命令的最后一步

把最后那个循环输出的awk改成逐行打印每个字段就行:

grep -e '<r p>' Inputfilename | sed 's/<[^>]*>//g' | awk '{ print $2 }' | awk '{ for (i=1;i<=NF;i++ ) print $i }' >> Output.txt

方案2:用sed一步替换换行(更简洁)

其实可以去掉多余的awk,直接让sed把空格换成换行符,这样每个值自动单独一行:

grep -e '<r p>' *.xml | sed 's/<[^>]*>//g; s/ /\n/g' >> Output.txt

如果输出里有多余的空行,再加个过滤去掉:

grep -e '<r p>' *.xml | sed 's/<[^>]*>//g; s/ /\n/g' | grep -v '^$' >> Output.txt

方案3:用awk一步到位(减少管道)

如果你想少用几个命令,直接用awk完成所有操作更高效:

awk '/<r p>/{gsub(/<[^>]*>/,"",$0); for(i=1;i<=NF;i++) print $i}' *.xml >> Output.txt

给你拆解下每个命令的作用:

  • grep -e '<r p>' *.xml:从所有XML文件里找出包含<r p>的行(用*.xml就能批量处理所有XML文件啦)
  • sed 's/<[^>]*>//g':删掉所有XML标签(匹配<到>之间的所有内容,替换成空)
  • sed 's/ /\n/g':把内容里的空格换成换行符,让每个值单独占一行
  • 最后的awk循环:遍历处理后每行的每个字段,逐行打印出来

小提醒:如果你的XML标签是跨行的,那grep这类行处理工具可能会漏抓,但如果是每行一个<r p>标签的简单结构,上面的命令完全够用。如果以后遇到复杂XML,再考虑用专门的XML工具比如xmlstarlet就行。

内容的提问来源于stack exchange,提问作者Khushbu Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:09:32