【问题标题】:Find actual line number of line after a match在匹配后查找实际行号
【发布时间】:2015-03-05 16:12:06
【问题描述】:

我想编辑 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]' 的第一次出现。

谢谢!

【问题讨论】:

  • 这几乎肯定是处理 XML 数据的错误方法。你能提供更多关于它的结构方式和选择标准的信息吗?有专门的 XML 处理工具更适合这种处理。
  • XML 是一个 STIG 清单,并且由于没有适用于 OS X 的 SCAP 内容,我正在尽可能多地编写脚本。还没有工具可以满足我的需要。
  • 不需要工具来处理您正在处理的 XML 派生格式的特殊风格;在基本层面上,它仍然是 XML。如果要替换属于特定节点的STATUS 节点,方法是通过XPath 选择它并使用xmlstarlet 之类的工具对其进行修改。如果我对您的 XML 的外观有更多了解,我可以向您展示。

标签: awk sed grep


【解决方案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>

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

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

    这会查找以First or Second or Third 开头的行和字符串&lt;STATUS&gt; 之间的行范围,并打印包含&lt;STATUS&gt; 的行的行号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多