我试图从两个字符串之间拉取值并换行每个结果。然后我希望将它与同一文档中的另一个值以相同的方式结合起来。问题是此文件中没有换行符,并且它非常大。以下是该文件的示例。
<ID>47</ID><DATACENTER_ID>36</DATACENTER_ID><DNS_NAME>myhost.domain.local</DNS_NAME> <IP_ADDRESS>10.0.0.1</IP_ADDRESS><ID>60</ID><DATACENTER_ID>36</DATACENTER_ID><DNS_NAME>yourhost.domain.local</DNS_NAME><IP_ADDRESS>10.0.0.2</IP_ADDRESS>
我的最终结果理想情况下会是这样的。
ID-----DNS_NAME
47-----myhost.domain.local
60-----yourhost.domain.local
到目前为止,我最接近的尝试是使用grep创建变量,但我似乎无法将它们格式化为表格。我也非常喜欢脚本,所以请原谅我的无知。
答案 0 :(得分:2)
如果您的grep支持-P
(--Perl-regexp
),那么您可以自由使用以下正则表达式。
$ grep -oP '<ID>\K[^<>]*(?=</ID>)|<DNS_NAME>\K[^<>]*(?=</DNS_NAME>)' file | sed 'N;s/\n/-----/g'
47-----myhost.domain.local
60-----yourhost.domain.local
\K
放弃以前匹配的字符进行打印。
(?=...)
posiitve lookahead断言,断言匹配发生的位置。它不会消耗任何角色。
答案 1 :(得分:0)
以下是gnu awk
(RS
中的多个字符)以获取您的数据:
awk -v RS="<ID>" -F"<|>" 'NR>1 {print $1"-----"$9}' file
47-----myhost.domain.local
60-----yourhost.domain.local