查找匹配后的实际行号

时间:2015-03-04 19:02:33

标签: awk sed grep

我想编辑XML文件中的一些行。这些行看起来都是相同的,它们只是一个块的一部分,它出现在其他一些独特的行之后,如:

First_Object
... some number of lines
<STATUS>true</STATUS>
... some number of lines
Second_Object
... some number of lines
<STATUS>true</STATUS>
... some number of lines
Third_Object
... some number of lines
<STATUS>true</STATUS>
... some number of lines

因此,对于First_Object,Second_Object,Third-Object等中的每一个,我需要获得true的实际行号,以便我可以将该值更改为其他值。

我开始使用“grep First_Object -A 100 filename | grep -n'[STATUS]'”(必须在此站点上使用方括号而不是角度)但是这给了我First_Object之后的行数,而不是行有问题的数字。我知道我可以将两者加在一起,但这看起来很混乱......必须有一种方法可以在字符串'First_Object'或类似的东西之后得到“第一次出现字符串'[STATUS]'。

谢谢!

2 个答案:

答案 0 :(得分:1)

如上所述,解析XML最好留给XML解析器,但是如果你真的有一些像你的示例数据一样的字面结构,那么这样的东西可能会有所帮助:

$ cat jo.awk
/_Object/ { obj = $0 }
/<STATUS>true<\/STATUS>/ { print obj ": line " NR ": " $0 }

bash-3.2$ cat jo.txt
First_Object
... some number of lines
<STATUS>true</STATUS>
... some number of lines
Second_Object
... some number of lines
<STATUS>true</STATUS>
... some number of lines
Third_Object
... some number of lines
<STATUS>true</STATUS>
... some number of lines

bash-3.2$ awk -f jo.awk jo.txt
First_Object: line 3: <STATUS>true</STATUS>
Second_Object: line 7: <STATUS>true</STATUS>
Third_Object: line 11: <STATUS>true</STATUS>

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -nr '/^(First|Second|Third)/,/^<STATUS>/{/^<STATUS>/=}' file

查找以First or Second or Third开头的行与字符串<STATUS>之间的行范围,并打印包含<STATUS>的行的行号。