
以下是我的文件的內容,
<A>
<number>100</number>
<name>Word1</name>
</A>
<A>
<number>101</number>
<name> Word2</name>
</A>
如果我 grep for Word1
,我試著看到如下輸出,
<A>
<number>100</number>
<name>Word1</name>
</A>
如果我 grep for Word2
,我試著看到如下輸出,
<A>
<number>101</number>
<name>Word2</name>
</A>
有人可以幫忙嗎?
答案1
如果這是格式良好的 XML 文件的一部分,您可以使用 XML 解析器提取所需的部分。
為了滿足結構良好要求,我已經使用<root>
和包裝了您的 XML 片段</root>
。
xmlstarlet sel -t -c '//A[name="Word1"]' -n file.xml
如果你不能直接滿足這個,你可以明確地包裝它
( echo '<root>'; cat file.xml; echo '</root>' ) | xmlstarlet sel -t -c '//A[name="Word1"]' -n
無論哪種情況,輸出都是這樣的:
<A>
<number>100</number>
<name>Word1</name>
</A>
答案2
和pcregrep
:
<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'
使用 GNU grep
:
<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '\0' '\n'
(儘管這意味著整個檔案被載入到記憶體中並假設它不包含 NUL 位元組)。
一些 PCRE 運算符:
(?s)
開啟s
標誌(.
匹配偶數行分隔符號).(?!</A>)
任何字符,前提是它不在 的開頭</A>
。.*?
非貪婪版本.*
(:...)
只是分組。
<![CDATA[</A>]]>
它被諸如或 找不到需要 XML 解析器的Word2
表達為<![CDATA[W]]>ord2>
或之類的東西所愚弄。Word2
但是,XML 解析器將需要有效的XML 輸入,而您的範例則不需要,除非您將其包含在頂級元素中,否則需要完整讀取該檔案(但話又說回來,這通常是您使用該格式時的任務)並且將可能改變內容(擴展<![CDATA
和一些&...;
序列)。 Xpath 表達式會導致很難在任何地方找到這些表達式,Word1
包括在註解、XML 標籤或屬性中。