Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在Unix中使用AWK或SED获取xml标记之间的文本_Shell_Unix_Sed_Awk - Fatal编程技术网

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
}