Shell 在Unix中使用AWK或SED获取xml标记之间的文本
可能重复:Shell 在Unix中使用AWK或SED获取xml标记之间的文本,shell,unix,sed,awk,Shell,Unix,Sed,Awk,可能重复: 我有以下格式的文本 [AccountID] [CallerID] [BilledAccountAttributes] 1111111 1111111 1111111 [\BilledAccountAttributes] [OBIOTax] 10 20 30 [\OBIOTax] [RINOTax] 777 888 999 [\RINOTax] [\CallerID] [\AccountID] [AccountID] [CallerID] [BilledAccou
我有以下格式的文本
[AccountID]
[CallerID]
[BilledAccountAttributes]
1111111
1111111
1111111
[\BilledAccountAttributes]
[OBIOTax]
10
20
30
[\OBIOTax]
[RINOTax]
777
888
999
[\RINOTax]
[\CallerID]
[\AccountID]
[AccountID]
[CallerID]
[BilledAccountAttributes]
2222222
2222222
2222222
[\BilledAccountAttributes]
[OBIOTax]
40
50
60
[\OBIOTax]
[\CallerID]
[\AccountID]
我想要以下格式的输出(当不显示RINOTAX时,用逗号分隔并置零)
有人能建议如何得到这个吗 我会用awk来做这个 我的方法是检查一行是否只包含一个数字。这可以通过正则表达式实现。awk的文档告诉您如何将其与awk一起使用 如果行包含
[\AccountID]
,则打印换行符
我会使用一个marker变量来记住当前打印行中是否有以前的值。如果打印了值,则将此标记设置为true。然后根据这个标记打印出一个逗号。如果您写了一个换行符(见上文),则将标记设置为false。因此,在下一个数字之前,不会打印逗号
一些伪代码(类似shell的语法):
我希望这能帮助您找到解决方案。Sed和AWK是这项工作的错误工具。。。用于解析的最强大工具是正则表达式,而正则表达式不适合解析xml——请参阅。最好使用xpath或您最喜欢的脚本语言的xml库。@Barton Chittenden:上面的文本不是xml。它看起来更像是某种基于行的格式,类似于XML,因为它有开始和结束标记。如果每个值都在自己的行上,那么awk将完成这项工作。与完全相同。这是家庭作业吗?。。。好的,将方括号变为尖括号,反斜杠变为正斜杠,也可以是XML。但这对点“不显示RINOTAX时置零”没有帮助是的,没错。我忽略了这个要求。很抱歉就像巴顿说的,你需要一个真正的解析器。
1111111,1111111,1111111, 10,20,30, 777,888,999
2222222,2222222,2222222, 40,50,60, 0, 0, 0
begin { marker = 0; }
{
if 'line contains number' then
if 'marker == 1' then print ','
print current line
set marker to 1
elsif 'line is end account id' then
set marker to 0
print '\n'
fi
}