2

<pre> </pre>HTML ファイルがあり、タグで囲まれたデータに興味があります。これを達成できるワンライナーはありますか?

サンプルファイル:

<html>
<title>
Hello There!
</title>
<body>
<pre>
John   Working
Kathy  Working
Mary   Working
Kim    N/A
</pre>
</body>
</html>

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

John 
Kathy 
Mary 
Kim 

どうもありがとうございました!

4

4 に答える 4

4

小枝ツールを手に入れましょう。それが持っているものの1つは、と呼ばれるものxml_grepです。あなたの問題は次のようになります

cat foo.txt | xml_grep --nowrap pre 

prexpath式です。次に、いくつかの単純なテキスト処理が続きます。これは、XML の形式が異なっていても機能します。

アドバイス - sed やその他のストリーム ベースのテキスト処理ツールを使用して、XML などの構造化データを操作しないでください。適切なパーサーを使用してください。

于 2010-05-24T17:29:24.683 に答える
2

XHTML を使用している場合は、xmlstarletを使用してください。そうでない場合は、最初に HTML Tidy に渡し、XHTML に変換します。

于 2010-05-24T17:06:26.180 に答える
2

sed を使用した解決策について具体的に尋ねたので... 興味深い行は常に and を含む行の間に<pre>あり</pre>(まったく同じように表示されます)、興味深いコンテンツが開始タグまたは終了タグと同じ行にあることは決してないと仮定し、最初のそのようなブロックは、抽出したい唯一のものであり、これがこの問題を解決するための実際には間違った方法であることを理解していても、それでもやりたいと仮定すると、たとえば次のように sed を使用してこれを行うことができます:

sed '1,/<pre>/d;/<\/pre>/,$d'

<pre>最初の行からそれを含む行までのすべての行と、それを含む行から</pre>最後までのすべての行を削除します。

(FWIW、興味深いコンテンツを選択するためにXPath式を使用したいと思います。たとえば、Ignacio Vazquez-Abramsが提案したxmlstarletを使用すると、次のようになりますxmlstarlet sel -t -v /html/body/pre。)

于 2010-05-24T20:52:16.410 に答える
1

私のPerl-fuは弱いですが、これはあなたの例ではうまくいきます:

$ cat file.html | perl -e'while(<>){if(/<\/pre>/){$a=0;}if($a){print}if(/<pre>/){$a=1;}}' | cut -f1 -d' '
John
Kathy
Mary
Kim
于 2010-05-24T17:14:33.413 に答える