Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-如何在XML标记之间获取多行文本_Xml_Bash_Parsing_Openwrt - Fatal编程技术网

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&#x2F;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&#x2F;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