在bash中多次出现的两个特定字符串之间提取文本

在bash中多次出现的两个特定字符串之间提取文本,bash,Bash,我有一个很大的xhtml文件,里面有很多我不需要的垃圾文本。我只需要位于该文件中多次出现的两个特定字符串之间的任何文本,例如 <html> <xyz> unneeded text </xyz> <mytag> important text1 </mytag> <xyz> unneeded text </xyz> <xyz> unneeded text </xyz> <mytag>

我有一个很大的xhtml文件,里面有很多我不需要的垃圾文本。我只需要位于该文件中多次出现的两个特定字符串之间的任何文本,例如

<html>
<xyz> unneeded text </xyz>
<mytag> important text1 </mytag>
<xyz> unneeded text </xyz>
<xyz> unneeded text </xyz>
<mytag> important text2 </mytag>
<mytag> important text3 </mytag>
<xyz> unneeded text </xyz>
</html>
我需要使用Bash脚本来实现这一点


感谢您的帮助

使用XML解析器将是最好的方法

使用带有PCRE的
grep
解决方案:

grep -Po '^<mytag>\s*\K.*?(?=\s*</mytag>$)'
grep-Po'^\s*\K.*(?=\s*$)'
示例:

$ cat file.xml                                    
<html>
<xyz> unneeded text </xyz>
<mytag> important text1 </mytag>
<xyz> unneeded text </xyz>
<xyz> unneeded text </xyz>
<mytag> important text2 </mytag>
<mytag> important text3 </mytag>
<xyz> unneeded text </xyz>
</html>

$ grep -Po '^<mytag>\s*\K.*?(?=\s*</mytag>$)' file.xml
important text1
important text2
important text3
$cat file.xml
多余的文本
重要文本1
多余的文本
多余的文本
重要文本2
重要文本3
多余的文本
$grep-Po'^\s*\K.*(?=\s*$)file.xml
重要文本1
重要文本2
重要文本3

使用XML解析器将是最好的方法

使用带有PCRE的
grep
解决方案:

grep -Po '^<mytag>\s*\K.*?(?=\s*</mytag>$)'
grep-Po'^\s*\K.*(?=\s*$)'
示例:

$ cat file.xml                                    
<html>
<xyz> unneeded text </xyz>
<mytag> important text1 </mytag>
<xyz> unneeded text </xyz>
<xyz> unneeded text </xyz>
<mytag> important text2 </mytag>
<mytag> important text3 </mytag>
<xyz> unneeded text </xyz>
</html>

$ grep -Po '^<mytag>\s*\K.*?(?=\s*</mytag>$)' file.xml
important text1
important text2
important text3
$cat file.xml
多余的文本
重要文本1
多余的文本
多余的文本
重要文本2
重要文本3
多余的文本
$grep-Po'^\s*\K.*(?=\s*$)file.xml
重要文本1
重要文本2
重要文本3

使用XML解析器是一种更好的方法,Linux中也有用于XML解析的命令行工具,例如:
xmllint
,但您可以使用
grep
这样做:

$ cat data1 
<html>
<xyz> unneeded text </xyz>
<mytag> important text1 </mytag>
<xyz> unneeded text </xyz>
<xyz> unneeded text </xyz>
<mytag> important text2 </mytag>
<mytag> important text3 </mytag>
<xyz> unneeded text </xyz>
</html>
$ grep -oP '(?<=<mytag>).*(?=</mytag>)' data1
 important text1 
 important text2 
 important text3  
$
$cat数据1
多余的文本
重要文本1
多余的文本
多余的文本
重要文本2
重要文本3
多余的文本

$grep-oP'(?使用XML解析器是一种更好的方法,Linux中也有用于XML解析的命令行工具,例如:
xmllint
,但您可以使用
grep
这样做:

$ cat data1 
<html>
<xyz> unneeded text </xyz>
<mytag> important text1 </mytag>
<xyz> unneeded text </xyz>
<xyz> unneeded text </xyz>
<mytag> important text2 </mytag>
<mytag> important text3 </mytag>
<xyz> unneeded text </xyz>
</html>
$ grep -oP '(?<=<mytag>).*(?=</mytag>)' data1
 important text1 
 important text2 
 important text3  
$
$cat数据1
多余的文本
重要文本1
多余的文本
多余的文本
重要文本2
重要文本3
多余的文本

$grep-oP'(?在Xml格式上使用正则表达式是有风险的,尤其是使用基于行的文本处理工具grep。您无法确保结果总是正确的

如果您的输入是有效的xml格式,我将使用xml方式:xpath表达式

使用工具
xmlstarlet
,您可以执行以下操作:

xmlstarlet sel -t -v "//mytag/text()" file.xml
它给出了所需的输出


您也可以使用
xmllint
,但是,您需要对输出进行进一步过滤。

在Xml格式上使用正则表达式是有风险的,尤其是使用基于行的文本处理工具grep。您无法确保结果始终正确

如果您的输入是有效的xml格式,我将使用xml方式:xpath表达式

使用工具
xmlstarlet
,您可以执行以下操作:

xmlstarlet sel -t -v "//mytag/text()" file.xml
它给出了所需的输出


您也可以使用
xmllint
,但是,您需要对输出进行进一步过滤。

请注意,和不是固定字符串。有许多不同的不需要的标记。请注意,和不是固定字符串。有许多不同的不需要的标记。非常感谢。我将测试并回复您。非常感谢。我会测试并回复你。非常感谢。我会测试并回复youThanks很多。我会测试并回复youThanks Kent,但问题是它是一个XHTML文件,所以它的格式一点也不好,xmllint能处理吗?@SoCRaT
可扩展超文本标记语言(XHTML)是XML标记语言家族的一部分
谢谢Kent,但问题是它是一个XHTML文件,所以它的格式一点也不好,xmllint能处理吗?@SoCRaT
可扩展超文本标记语言(XHTML)是XML标记语言家族的一部分