打印包含转义字符的两个字符串之间的内容 (Linux/Bash)

打印包含转义字符的两个字符串之间的内容 (Linux/Bash)

我正在尝试编写一个脚本,在许多 .app 文件中搜索我的服务器并输出两个字符串之间的内容 - 仅输出两个字符串之间发生的内容。我可以使用 AWK 和 GREP 执行此操作,但是,我需要搜索的术语具有转义字符,因此这不起作用。

以下是 .dat 文件摘录:

   <List Variable name="lookups">
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >             
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >         
  </Variable>
  <List Variable name="lookups_for_data">
      <Value>
        <Value name="lookups" value="LSM_OPT"/>
  </Variable>

我需要找到“List Variable name =“lookups”'和“/Variable”之间的所有数据,而没有其他内容......问题的一部分是转义字符,而且,.dat 文件中还有其他条目不想捕获,但它们包含我的原始搜索值以及一些附加数据...例如上面的“列表变量名称=“lookups_for_data””..我不想要这些。

我尝试了几个 awk 和 sed 选项,但我认为问题在于转义字符。任何帮助将不胜感激!感谢您的帮助!!

答案1

从它的声音来看,您只想查找文件中出现在这两个标记字符串之间的所有内容:

<List Variable name="lookups">
   ...
   ...
</Variable>

为此,您可以使用以下sed命令:

$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d;//d' file.dat
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >

这将打印之间的所有行,但忽略 2 条标记行。

怎么运行的

上面的代码查找与起始模式匹配的行,<List Variable name="lookups">然后查找所有行,直到遇到第二个匹配行<\/Variable>。对于这些之间的行,sed不会删除它们,!d。对于所有其他行,din!d将删除它们。第二个//d删除标记线。

如果您想执行上述操作,并打印标记线,您可以将上面的sed命令更改为:

$ sed '/<List Variable name="lookups">/,/<\/Variable>/!d' file.dat
   <List Variable name="lookups">
    <Value>
        <Value name="lookups" value="LSM_OPT"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="123_Done"/>
        <OTHER GARBAGE... >
        <Value name="lookup_name" value="XYZ_DONE"/>
        <OTHER GARBAGE... >
  </Variable>

相关内容