2017-07-09 13 views
0

XMLのタグの間に、複数行のテキスト...バッシュ - 私は、テキストファイルを持っている

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

+2

適切なツールを使用します。 XML/HTMLパーサ(xmlstarlet、xmllint ...)を使うことをお勧めします。 – Cyrus

+0

@Cyrus悲しいことに、openwrtにはこのようなツールはありません。私はopenwrtでLinuxのPCベースのディストリビューションには使用しません – Joe

答えて

0

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 
+0

なぜPerlモードで動作するのですか正規表現ではないのですか? – uliwitness

+0

Perlの正規表現では、式( ''と '')で頭と尾を削除することができます。 – Cyrus

0

代替アプローチ:

tr \\n \\r < test.xml | sed 's:.*<content>\([^<]*\)<.*:\1:' | tr \\r \\n 
0

がここにもawkの溶液で試してください。

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

文字列を探している行があれば、それをNULLに置き換えて現在の行を出力し、変数Aの値をNULLにします。次に言及すると、それ以降の文はすべてスキップされます。 文字列を探していれば、その文字列をNULLに置き換えて、変数Aに値1を代入します。

変数Aを書くことは、Aの値がTRUE(NOT NULL)であるかどうかをチェックする条件であることを意味し、現在の行を出力します(Aの値は文字列が見つかるとTRUEになり、閉じた文字列が任意の行にある場合はNULL)。