1

私の正規表現は悲しいことに不足しており、「Mastering Regex」を読んだり、いくつかのオンラインチュートリアルを読んだりしていますが、どこにも行きません。

入力ファイルは大まかに次のようになります。

<html>
 <head>
  <title>My Title</title>
 </head>
<body>
 <p>Various random text...</p>
 <ul>
  <li>One</li>
  <li><a href="example.com">Two</a></li>
  <li>Three</li>
 </ul>
 <p>Various random text...</p>
 </body>
</html>

私の最終的な目標は、出力することです:

My Title,One,<a href="example.com">Two</a>,Three

例: タイトル付きのコンマ区切りの値と、li タグの内容

ただし、最初のステップは、タイトルを含むすべてを削除することです.sedを使用することにしたので(WindowsでGNU sedバージョン4.2を実行しています)、次のようにします:

タイトルタグまでの改行を含む「すべて」を一致させ、意味のないものに置き換える必要があると考えています。

すべての文字をドットと一致させ、改行 /n も一致させて、クラスを作成し、* で繰り返すようにします。

それで

type file.html | sed "s/[.\n]*<title>//"

しかし、これは機能しません。文字列のタイトルを削除するだけで、その前のものは削除しません。

どこが間違っていますか?理解したい。

アドバイスをいただければ幸いです。前もって感謝します。

4

2 に答える 2

1

sed(およびtr、およびsed ...)の使用:

sed -n -e '/<title>\|<li>/{s/^[ ]*<[^>]*>//;s/<[^>]*>[ ]*$//p}' input | \
    tr '\n' , | sed 's/,$/\n/'

単一の sed 式を使用する:

sed ':a;N;$!ba;s/\n//g;        # loop, read-in all file, remove newlines 
     s/.*<title>//;            # remove everything up to, including <title>
     s/title>.*<ul>/title>/;   # remove everything between </title> and <ul>
     s!</ul>.*!!;              # remove everything after </ul>, inclusive
     s!</li>\|</title>!,!g;    # substitute closing tags with commas
     s/<li>//g;                # remove <li> tags
     s/,[ ]*$//                # delete the trailing comma
     ' input
于 2013-01-03T03:33:57.803 に答える
0

Ruby ソリューション

さまざまな方法でやりたいことを実行できますが、他の方法よりもエレガントなものもあります。これは、1 つの Ruby ワンライナーで期待どおりの結果を得る簡単な方法です。

ruby -ne 'BEGIN { output = "" }
          output << $1 + ?, if %r{<(?:title|li)>(.*)</\1?}
          END { puts output.sub(/,$/, "") }' /tmp/foo.html

このスクリプトは、元の質問で説明されている形式で結果を出力します。たとえば、提供されたサンプル テキストを使用すると、次のように出力されます。

My Title,One,<a href="example.com">Two</a>,Three
于 2013-01-03T06:40:50.373 に答える