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