我正在阅读这个问题: 使用bash在文本文件中提取2个记号之间的行,因为我有一个非常类似的问题…我必须在这个xml文件中提取(并保存到$variables前打印)文本:
<--more labels up this line> <ExTradataItem name="GUI/LastVMSelected" value="14cd3204-4774-46b8-be89-cc834efcba89"/> <--more labels and text down this line-->
我只需要得到值=(显然没有括号和没有'值='),但首先,我认为它必须search“GUI / LastVMSelected”到这一行,因为在其他可能有一个类似的值字段线,而这个标签的价值是我想要的。
bash和ksh之间的子shell差异
无法使用通配符进行SSH命令
如何通过windows批量操作recursionreplace名称
优化处理Segfault
Windows脚本语言
如果他们在同一行上(因为他们似乎是从你的例子),它甚至更容易。 只是:
sed -ne '/name="GUI/LastVMSelected"/s/.*value="([^"]*)".*/1/p'
说明:
/ name =“GUI / LastVMSelected”/:只有匹配这个模式的行
S /。 value =“([^”])“ 。/ 1 / p
取代所有内容,捕获括号内的部分(值的值)
并打印结果
我假设你是从一个XML文档中提取的。 如果是这种情况,请查看用于处理XML的XMLStarlet命令行工具。 这里有一些查询XML文档的文档。
用这个:
for f in `grep "GUI/LastVMSelected" filename.txt | cut -d " " -f3`; do echo ${f:7:36}; done
grep让你只有你需要的线路
cut使用某个分隔符分割行,并返回分隔的第N个结果
-d " "将分隔符设置为空格
-f3返回第三个结果(基于1的索引)
${f:7:36}提取从索引7开始的长度为36个字符的子字符串。 这摆脱了主导value="和尾随斜线等。
很显然,如果字段的顺序发生变化,这将会中断,但是如果你只是在快速和肮脏的工作之后,应该是这样。
使用我的答案你链接的问题:
sed -n '/<!--more labels up this line-->/{:a;n;/<!--more labels and text down this line-->/b;|GUI/LastVMSelected|s/value="([^=]*)"/1/p;ba}' inputfile
说明:
-n – 不要做隐式打印
/<!-- this is token 1 -->/{ – 如果找到了起始标记,那么
:a – 标签“a”
n – 读下一行
/<!-- this is token 2 -->/q – 如果是结束标记,则退出
|GUI/LastVMSelected| – 如果该行匹配字符串
s/value="([^"]*)"/1/p – 在'value ='后打印下一个报价
ba – branch标签“a”
}如果结束
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。