Bash - 如何在 XML 标签之间获取多行文本

Bash - How to get multi line text between XML tags

我有一个文本文件...

# <?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>

我想提取 <content></content> 之间的文本。我试过:

grep -oP '(?<=<content> ).*?(?= </content>)' file

但是它没有输出任何东西,我希望最终结果是这样的:

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

我该怎么做?

使用 GNU grep 和 Perl 正则表达式 (-P):

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>\([^<]*\)<.*::' | tr \r \n

在这里也尝试使用 awk 解决方案。

awk '/<\/content>/{sub(/<\/content>/,"");print;A="";next} /<content>/{sub(/<content>/,"");A=1} A'   Input_file

寻找 string ,如果有任何行有,则将其替换为 NULL 并打印当前行,然后将变量 A 的值设置为 NULL。提及下一个将跳过所有进一步的语句。 现在寻找字符串,如果有任何行,然后用 NULL 替换该字符串,并为它分配一个值为 1 的变量 A。

现在只写变量 A 意味着它是一个条件,它将检查 A 的值是否为 TRUE(NOT NULL),然后它将打印当前行。(A 的值将仅在找到开始字符串时为 TRUE 并将被设置当在任何行中找到关闭字符串时为 NULL)。