代码之家  ›  专栏  ›  技术社区  ›  Joe

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

  •  0
  • Joe  · 技术社区  · 7 年前

    我有一个文本文件。。。

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

    我该怎么做?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Cyrus    7 年前

    使用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
    
        2
  •  0
  •   hidefromkgb    7 年前

    替代方法:

    tr \\n \\r < test.xml | sed 's:.*<content>\([^<]*\)<.*:\1:' | tr \\r \\n
    
        3
  •  0
  •   RavinderSingh13 Nikita Bakshi    7 年前

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

    查找字符串,如果任何一行有该字符串,则将其替换为NULL并打印当前行,然后将变量A的值设置为NULL。提及next将跳过所有进一步的陈述。 现在寻找字符串,如果任何一行有该字符串,则用NULL替换该字符串,并使一个值为1的变量a赋给它。