Bash-如何在XML标记之间获取多行文本
我有一个文本文件Bash-如何在XML标记之间获取多行文本,xml,bash,parsing,openwrt,Xml,Bash,Parsing,Openwrt,我有一个文本文件 # <?xml version="1.0" encoding="UTF-8"?> <response> <content>Pulsa:Rp200,Bonus:0 s/d 12-JUL-17. 1GB Rp10rb.Mau? 1. Mau 2. Info 3. Internet 4. RAMADHAN HOTSALE 5. Nelpon 6. SMS 7. BB 8. NEW:UNLIMITED INTERNET 9. Roa
# <?xml version="1.0" encoding="UTF-8"?>
<response>
<content>Pulsa:Rp200,Bonus:0 s/d 12-JUL-17. 1GB Rp10rb.Mau?
1. Mau
2. Info
3. Internet
4. RAMADHAN HOTSALE
5. Nelpon
6. SMS
7. BB
8. NEW:UNLIMITED INTERNET
9. Roaming
10. 100MB2K</content>
</response>
如何实现这一点?使用GNU grep和Perl正则表达式(
-p
):
grep-Poz'(?替代方法:
tr \\n \\r < test.xml | sed 's:.*<content>\([^<]*\)<.*:\1:' | tr \\r \\n
tr\\n\\r
awk '/<\/content>/{sub(/<\/content>/,"");print;A="";next} /<content>/{sub(/<content>/,"");A=1} A' Input_file
awk'/{sub(//,“”);print;A=”“;next}/{sub(//,“”);A=1}A'输入文件
寻找字符串,如果任何一行有该字符串,则将其替换为NULL并打印当前行,然后将变量A的值设置为NULL。接下来提及将跳过所有进一步的语句。
现在寻找字符串,如果任何一行都有,那么用NULL替换字符串,并为其赋值为1的变量a
现在只写变量A意味着它是一个检查A的值是否为真(非空)的条件,然后它将打印当前行。(A的值只有在开始查找字符串时为真,在任何行中找到闭合字符串时将设置为空)。使用适当的工具。我建议使用XML/HTML解析器(xmlstarlet,xmllint…。@Cyrus遗憾的是openwrt没有这样的工具,我在openwrt上使用它,而不是在基于linux PC的发行版上使用它。你能解释一下为什么它在Perl模式下工作,而不是在正则正则表达式中吗?使用Perl正则表达式,可以用表达式(
和
)删除头和尾。
grep -Poz '(?<=<content>)(.*\n)*.*(?=</content>)' file.xml
Pulsa:Rp200,Bonus:0 s/d 12-JUL-17. 1GB Rp10rb.Mau?
1. Mau
2. Info
3. Internet
4. RAMADHAN HOTSALE
5. Nelpon
6. SMS
7. BB
8. NEW:UNLIMITED INTERNET
9. Roaming
10. 100MB2K
tr \\n \\r < test.xml | sed 's:.*<content>\([^<]*\)<.*:\1:' | tr \\r \\n
awk '/<\/content>/{sub(/<\/content>/,"");print;A="";next} /<content>/{sub(/<content>/,"");A=1} A' Input_file