我正在尝试编写一个脚本,在许多 .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
。对于所有其他行,d
in!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>