在bash中,如何解析一个字符串以除去除两个标签之外的所有内容?
在这个问题中,用户想要解析一个字符串,只保留两个标签之间的内容,而去除其他部分。根据提供的内容,我们可以看出用户想要在给定的XML文件中提取出
解决方法:
1. 使用xmllint和XPath查询来提取
$ cat input.xml | xmllint --xpath '//id' -
2. 如果没有xmllint或更适合的工具可用,可以使用Perl、grep和sed命令来提取
$ cat input.xml | perl -pe 's/(<.?id.)/\n$1/g' | grep '^<id>' | sed -e 's/$/<\/id>/'
3. 如果无法正确使用XPath查询,可以使用xmllint的--format选项将XML转换为易于使用基于行的工具的格式。可以通过以下命令来实现:
$ cat input.xml | xmllint --format - | grep '^\s*<id>'
通过使用上述解决方法,用户可以成功提取出两个
原因:该问题的出现是因为用户需要使用bash来解析一个字符串,只保留两个标签之间的内容,并且需要使用sed命令来实现。
解决方法:用户可以使用下面的sed命令来解决该问题:
echo "$STRING" | sed 's/<\/id>.*/<\/id> /;s/ //;s/ //;'
该命令的输出结果将会是:
15 16
该命令的工作原理如下:
1. 使用 `sed 's/<\/id>.*
2. 使用 `sed 's/
3. 使用 `sed 's/
希望这能帮到你。
用户回复:嘿,谢谢你的答案,通过一些简单的修改,这个方法将会非常好用 🙂 我没有列出我要解析的整个XML文件,但是我将在后端添加所有额外的标签。谢谢!
回答者回复:不客气,很高兴能帮到你。
问题的原因是用户想要在bash中解析一个字符串,只保留两个标签之间的内容。用户尝试了一种sed命令的方法,但是出现了一些问题。下面是对sed命令的一些调整建议:
sed 's=.*\(<id>.*</id>\).*=\1='
这里需要选择一个在命令表达式中不会出现的分隔符。因为关闭标签``中使用了`/`作为分隔符,所以我使用了`=`作为替代。
然后`*`修饰了紧接其后的正则表达式,表示"0个或多个"。你之前在`>`之后使用了`*`,表示"0个或多个右尖括号"。而你真正应该使用的是`.`,表示任意一个字符,所以带括号的表达式现在可以匹配整个`
最后,`\1`表示将第一个带括号的子表达式的结果放入结果字符串中。
这种方法对于通用解决方案存在一些限制,但如果你知道每行只有一个ID字段,它应该能满足你的需求。