我想编辑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]'。
谢谢!
答案 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>
的行的行号。