2016-04-25 22 views
0

私は不要な迷惑テキストがたくさんある大きなxhtmlファイルを持っています。私はそのファイル内で何度も出現する2つの特定の文字列の間にあるテキストを必要とします。bashの複数の特定の文字列の間でテキストを抽出する

<html> 
<xyz> unneeded text </xyz> 
<mytag> important text1 </mytag> 
<xyz> unneeded text </xyz> 
<xyz> unneeded text </xyz> 
<mytag> important text2 </mytag> 
<mytag> important text3 </mytag> 
<xyz> unneeded text </xyz> 
</html> 

私の出力は次のようになります。

important text1 
important text2 
important text3 

私はbashスクリプトを使用していることを行う必要があります。

ご協力ありがとうございます

+0

は固定ストリングではありません。さまざまな不必要なタグがたくさんあります。 – SoCRaT

答えて

0

XMLパーサーを使用するのが最適な方法です。 PCREでgrepを使用して

ソリューション:

grep -Po '^<mytag>\s*\K.*?(?=\s*</mytag>$)' 

例:XMLパーサーを使用して

$ cat file.xml          
<html> 
<xyz> unneeded text </xyz> 
<mytag> important text1 </mytag> 
<xyz> unneeded text </xyz> 
<xyz> unneeded text </xyz> 
<mytag> important text2 </mytag> 
<mytag> important text3 </mytag> 
<xyz> unneeded text </xyz> 
</html> 

$ grep -Po '^<mytag>\s*\K.*?(?=\s*</mytag>$)' file.xml 
important text1 
important text2 
important text3 
+0

ありがとうございました。私はテストして、あなたに戻ってきます。 – SoCRaT

0

がより良いアプローチである、また、例えば、LinuxでのXML解析のためのラインツールがコマンドされています。 xmllintでも、このようにgrepを使用するとできます。

$ cat data1 
<html> 
<xyz> unneeded text </xyz> 
<mytag> important text1 </mytag> 
<xyz> unneeded text </xyz> 
<xyz> unneeded text </xyz> 
<mytag> important text2 </mytag> 
<mytag> important text3 </mytag> 
<xyz> unneeded text </xyz> 
</html> 
$ grep -oP '(?<=<mytag>).*(?=</mytag>)' data1 
important text1 
important text2 
important text3 
$ 

(?<=<mytag>).*(?=</mytag>)これはXML形式に正規表現を使用して正の先読みおよび後読みアサーション

+0

ありがとうございました。私はテストしてあなたに戻ってきます – SoCRaT

2

を使用してテキストを抽出するには、特にラインとベースのテキスト処理ツールのgrep危険です。結果が常に正しいことを確認することはできません。

入力が有効なxml形式だった場合は、xmlの方法:xpath式を使用します。

ツールxmlstarletで、あなたは行うことができます:

xmlstarlet sel -t -v "//mytag/text()" file.xml 

それは所望の出力を提供します。

また、xmllintで行うこともできますが、出力をさらにフィルタリングする必要があります。

+0

ありがとうケントですが、問題はそれがXHTMLファイルだから、全くフォーマットされていないので、xmllintはそれを処理できるのでしょうか? – SoCRaT

+0

@SoCRaT 'XHTML(Extensible Hypertext Markup Language)は、XMLマークアップ言語のファミリーの一部です – Kent

関連する問題