ファイル内のテキストを見つけてcsvにコピーする

ファイル内のテキストを見つけてcsvにコピーする

複数のHTMLファイル(約500K)からテキストを抽出する必要があります。コピーするテキストは次のとおりです。<div class='cls '>text to be copied including some<span>and <p></p></span>and more text</div>

私が決める(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)

grepを使ってこれを行う方法についての他の質問を読んで、コマンドは次のとおりです。

grep -r "/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" *.html > output.txt

しかし、これはうまくいきません。私は何が間違っていましたか?

また試しましたpcregrep -r -regexp="/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" --file-list=fl.txt > output.txt– 何もしませんでしたpcregrep -r -regexp="/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" > output.txt– 何もしませんでした

編集1:次の形式の提案を試してください。

grep -f -r "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" *.html >> touch output.txt
grep: -r: No such file or directory
grep -f -r "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" *.html >> output.txt
grep: -r: No such file or directory
grep -f -r "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" *.html >> output.txt
grep: -r: No such file or directory

 grep -f "/(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/" file111.html >> touch output.txt
grep: /(?:\<div\sclass\=\'desc\s\'\>)(.*)(?=\<\/div\>)/: No such file or directory

そして他の順列はまだありません

答え1

なぜこんなに素晴らしい広告の鐘と笛を追加したのかわかりません。この単純な正規表現は私にとって効果的です。

grep "<div\sclass='cls\s'>.*<\/div>" file
<div class='cls '>text to be copied including some<span>and <p></p></span>and more text</div>

答え2

次の6つの質問があります。

  1. /正規表現の始めと終わりにコンテンツを含めます。検索する別のプログラムを入力しますが、必要ありません。実際、パターンにはリテラル文字のみが含まれます。/regex/sedvigrepgrep/
  2. (通常)でPCREを使用するには、grepを使用する必要があります-P
  3. そんなことはない-regexpでしょう--regexp。または のようにこれを省略し、正規—regexp=表現を素朴な引数として提供しますgrep

上記のエラーを修正した後、(およびgrep -P)コマンドはすべて機能しましたが、前後のテキストを含むパターンを含むpcregrep行全体を印刷しました。<div …></div>

  1. パターンに一致するテキストのみを印刷するには、を指定する必要があります-o

問題を解決しましたが、それでも出力にその内容が表示さ<div …>れます(ただし、前のテキストまたは後のテキストは表示されません)。だから、<div …></div>

  1. リアビューグループに問題があります。競争に含まれています。

    残念ながら、私は問題が何であるか、解決策を正確に知ることができるほどPCREについて十分に知りません。幸いなことに、私はpcregrep解決策を十分に知っています。正規表現に複数のキャプチャグループがある場合は、 pcregrep出力を書き込むキャプチャグループを選択できます。したがって、pcregrep LookBehindをキャプチャグループに変換してから無視して機能させることができます。

    pcregrep -o2-r "(\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)"

    しかし、これでさえ必要なものよりも複雑です。最初の(<div …>)グループはキャプチャグループである必要はありません。つまり、グループである必要はありません。同様に、最後のグループ(</div>予測グループ)はグループである必要はありません。グループでなければならない唯一のことは、キャプチャしたい部分と<div …>次の間の部分です</div>

    pcregrep-o1-r "\<div\sclass\=\'cls\s\'\>(.*)\<\/div\>"

    今セットが1つしかないので  -o2に変更しました。-o1

    しかし、ルディックが発見しました(しかし言及されていない)これらのバックスラッシュはほとんど必要ありません。 AFAICT、必要なのは\s文字列にあるだけなので、上記の内容を次のように単純化できます。

    pcregrep -o1 -r "<div\sclass='cls\s'>(.*)</div>"

    これで、正規表現のすべてのPCRE部分(前後に)を削除したので、この正規表現を正規表現と比較できると考えることができますgrep。残念ながら、上記のコマンドはオプションによって異なります。いいえ。-oNgrep

    ただし、!と組み合わせることができますsed

    sed -n -r "s|.*<div\sclass='cls\s'>(.*)</div>.*|\1|p"

    そのpcregrepコマンドと同様に、このコマンドは完全正規表現(最初と最後に項目を追加したため、<div …>前または後に来る項目を含む)を検索し、それを#1キャプチャグループ(唯一の項目)に置き換えます。最後のオプションは一致する行を印刷し、このオプションは一致しない行を印刷しないようにします。</div>.*p-n

    上記の正規|表現にはが含まれているため、正規表現の区切り文字として機能します/。これを区切り文字として使用するには、/テキストをエスケープする必要があります/</div>)。

    sed -n -r"s/.*<div\sclass='cls\s'>(.*)<\/パーティション>.*/\1/

    残念ながら、sed再帰検索機能はありません。このオプションは、-r拡張正規表現(ERE)の使用を指定するのと似ています。これがない場合は、キャプチャグループを使用する必要があります。sed-Egrep\(\)

    sed -n "s/.*<div\sclass='cls\s'>\(.*\)<\/div>.*/\1/p"

    sedもちろん、実行して再帰検索を実行できますfind

    PS 1行に...ペアが複数ある場合、<div …>このコマンドは最初のペアのみを印刷します。</div>sed

  2. 再帰(ディレクトリツリー)検索が無効です。

    grep -r正規表現*.html

    pcregrep再)各ファイルを見.htmlてください。すべてどんなファイルでも 名前が終わるディレクトリ .html。したがって、(おそらく?)というサブディレクトリがある場合、上記のコマンドfoo.htmlは検索を実行します。すべてMakefileそのディレクトリにあるファイルです(またはと呼ばれる場合も同様ですREADME.txt)。 (私の考えでは)page42と同様の名前を持つサブディレクトリがある場合、indexそのディレクトリは検索されません。

    あなたがしたいことは:

    grep -r --include='*.html'正規表現

    次から始まるすべてのディレクトリに対して再帰検索を実行します。.(現在のディレクトリ)名前が一致するファイルのみを表示します*.html

答え3

grep -r "/(?:\<div\sclass\=\'cls\s\'\>)(.*)(?=\<\/div\>)/" *.html > output.txt

再帰的に動作しますが、正規表現を解釈しません。代わりにfgrepまたはgrep -f -rを試してください。また、touch output.txt>の代わりに>>を使用することもできます。

関連情報