複数の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つの質問があります。
/
正規表現の始めと終わりにコンテンツを含めます。検索する別のプログラムを入力しますが、必要ありません。実際、パターンにはリテラル文字のみが含まれます。/regex/
sed
vi
grep
grep
/
- (通常)でPCREを使用するには、
grep
を使用する必要があります-P
。 - そんなことはない
-regexp
でしょう--regexp
。または のようにこれを省略し、正規—regexp=
表現を素朴な引数として提供しますgrep
。
上記のエラーを修正した後、(およびgrep -P
)コマンドはすべて機能しましたが、前後のテキストを含むパターンを含むpcregrep
行全体を印刷しました。<div …>
</div>
- パターンに一致するテキストのみを印刷するには、を指定する必要があります
-o
。
問題を解決しましたが、それでも出力にその内容が表示さ<div …>
れます(ただし、前のテキストまたは後のテキストは表示されません)。だから、<div …>
</div>
リアビューグループに問題があります。競争に含まれています。
残念ながら、私は問題が何であるか、解決策を正確に知ることができるほど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
。残念ながら、上記のコマンドはオプションによって異なります。いいえ。-oN
grep
ただし、!と組み合わせることができます
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
-E
grep
\(
\)
sed -n "s/.*<div\sclass='cls\s'>\(.*\)<\/div>.*/\1/p"
sed
もちろん、実行して再帰検索を実行できますfind
。PS 1行に...ペアが複数ある場合、
<div …>
このコマンドは最初のペアのみを印刷します。</div>
sed
再帰(ディレクトリツリー)検索が無効です。
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
>の代わりに>>を使用することもできます。