多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
相关产品推荐
相关产品推荐

