相对于第一次查找运行第二个grep

时间:2016-09-30 13:39:45

标签: bash awk sed grep

我需要在文本中找到一个特定的字符串,然后根据字符串的位置,找到一个关闭它的第二个字符串(向后)并打印信息。我得到了以下内容:

ValueError: cannot reindex a non-unique index with a method or limit

文字全部都是一行,我将它分开分开,以便更容易查看。最初它看起来像这样:

<tile x="143" y="43" z="7">
<item id="2656"/>
<item id="2111" count="5"/>
<item id="2194"/>
<item id="2205"/>
<item id="2400"/>
</tile>

<tile x="143" y="44" z="7">
<item id="2656"/>
<item id="2111" count="5"/>
<item id="2194"/>
<item id="2205"/>
</tile>

<tile x="143" y="45" z="7">
<item id="2656"/>
<item id="2111" count="5"/>
<item id="2194"/>
<item id="2205"/>    
</tile>

<tile x="144" y="43" z="7">
<item id="2656"/>
<item id="2194"/>
<item id="2111" count="5"/>
<item id="2506" special_description="something something something (Arm:12) [Test]"/>
<item id="2194"/>
<item id="2216"/>
<item id="2400"/>
</tile>

<tile x="144" y="44" z="7">
<item id="2656"/>
<item id="2111" count="5"/>
<item id="2194"/>
<item id="2418"/>
<item id="2216"/>
<item id="2431"/>
</tile>

<tile x="144" y="45" z="7">
<item id="2656"/>
<item id="2658"/>
<item id="2111" count="5"/>
<item id="2506" special_description="something something (Arm:12) [Whatever]"/>
<item id="2194"/>
<item id="2216"/>
</tile>

<tile x="146" y="43" z="7">
<item id="1738"/>
<item id="1738"/>
<item id="1738"/>
<item id="2160" count="50"/>
<item id="2183"/>
<item id="2127"/>
<item id="2127"/>
<item id="2205"/>
<item id="2506"/>
<item id="2127"/>
</tile>

让我们说我正在寻找2个特定的项目ID - 2506和2418.我在使用grep的第四个tile块中找到2506,现在我想看看是什么瓷砖坐标:

我发现了这个:

<tile x="143" y="43" z="7"><item id="2656"/><item id="2111" count="5"/><item id="2194"/><item id="2205"/><item id="2400"/></tile><tile x="143" y="44" z="7">...

在它正上方我找到了:

<item id="2506" special_description="something something something (Arm:12) [Test]"/>

我如何能够为所有这些信息提取磁贴信息,获取特殊描述(如果存在)并生成日志?

理想情况下它看起来像这样(但只要我提取了所有信息,输出就不那么重要了):

<tile x="144" y="43" z="7">

理想情况下,如果有人能为我提供一个现成的解决方案,我们将非常感激,但只需一个有用的指针即可!

2 个答案:

答案 0 :(得分:1)

awk救援!

这可能会让你开始......

$ awk -F'\n' -v RS= '/id="2506"/{print $1}' file

<tile x="144" y="43" z="7">
<tile x="144" y="45" z="7">
<tile x="146" y="43" z="7">

答案 1 :(得分:1)

最好编写一个脚本来执行此操作。这是伪代码:

for all lines in file do {
  if line =~ /pattern1/ {
    match1 = line
  }
  elsif line =~ /pattern2/ {
   echo line, match1
  }
}