6

ここで本当に基本的な質問。だから私はドットと言われています。改行を除くすべての文字に一致します。改行を含め、どの文字にも一致するものを探しています。

私がやりたいのは、Webサイトページの2つの特定の文字列の間のすべてのテキストをキャプチャし、ヘッダーとフッターを削除することです。HEADER TEXT(。+)FOOTER TEXTのようなものを入力してから、括弧内の内容を抽出しますが、ヘッダーとフッターの間にすべてのテキストと改行を含める方法が見つかりません。これは意味がありますか?前もって感謝します!

4

7 に答える 7

7

改行を含む複数の文字を一致させる必要がある場合は、次のようにします。

[\s\S]*?

欲張りでないパターンを使用していることに注意してください

于 2009-12-13T19:16:20.847 に答える
3

あなたはPerlでそれを行うことができます:

$ perl -ne 'print if /HEADER TEXT/ .. /FOOTER TEXT/' file.html

区切り文字の間のテキストのみを印刷するには、次を使用します。

$ perl -000 -lne 'print $1 while /HEADER TEXT(.+?)FOOTER TEXT/sg' file.html

この/sスイッチにより、正規表現マッチャーは文字列全体を単一行として処理します。これは、ドットが改行と一致することを/g意味し、可能な限り一致することを意味します。

上記の例は、ローカルディスク上のHTMLファイルをクランキングしていることを前提としています。最初にそれらをフェッチする必要がある場合は、getfromを使用してLWP::Simpleください:

$ perl -MLWP::Simple -le '$_ = get "http://stackoverflow.com";
                          print $1 while m!<head>(.+?)</head>!sg'

上記のような正規表現を使用したHTMLの解析は、一般的なケースでは機能しないことに注意してください。迅速で汚れたスキャナーで作業している場合は問題ありませんが、より堅牢である必要があるアプリケーションの場合は、実際のパーサーを使用してください。

于 2009-12-13T19:09:32.617 に答える
3

定義上、grep一致する行を探します。行を読み取り、一致するかどうかを確認して、行を印刷します。

あなたが望むことをするための1つの可能な方法はsed

sed -n '/HEADER TEXT/,/FOOTER TEXT/p' "$@"

これは、「HEADERTEXT」に一致する最初の行から「FOOTERTEXT」に一致する最初の行まで印刷してから、繰り返します。'-n'は、デフォルトの'各行の印刷'操作を停止します。ヘッダーとフッターのテキストが同じ行に表示される場合、これはうまく機能しません。

あなたがやりたいことをするために、私はおそらく使うでしょうperl(しかしあなたが望むならあなたはPythonを使うことができます)。ファイル全体を丸呑みしてから、適切に修飾された正規表現を使用して、ファイルの一致する部分を見つけることを検討します。ただし、「@ gbacon」で指定されたPerlワンライナーは、上記の「sed」スクリプトのPerlへのほぼ正確な音訳であり、丸呑みするよりもきれいです。

于 2009-12-13T19:12:18.413 に答える
2

のマニュアルページにgrepは次のように書かれています。

grep、egrep、fgrep、rgrep-パターンに一致する行を出力します

grep複数の行を照合するために作成されていません。perlまたはを使用してこのタスクを解決してみてくださいawk

于 2009-12-13T19:11:55.403 に答える
2

これは「bbedit」でタグ付けされており、BBeditはPerlスタイルのパターン修飾子をサポートしているため、ドットをスイッチとの改行に一致させることができます(?s)

(?s)。

任意の文字に一致します。はい、(?s)。+はテキスト全体に一致します。

于 2011-08-09T12:05:28.293 に答える
1

他の場所で指摘されているように、grepは単一行のものに対して機能します。

複数行の場合(RubyでRegexp :: MULTILINEを使用する場合、またはpython、awk、sedなど)、「\ s」は改行もキャプチャする必要があるため、

HEADER TEXT(.*\s*)FOOTER TEXT 

動作する可能性があります...

于 2009-12-13T19:09:53.700 に答える
0

あなたがそれを持っているなら、これがgawkでそれをする1つの方法です

awk -vRS="FOOTER" '/HEADER/{gsub(/.*HEADER/,"");print}' file
于 2009-12-14T00:02:32.520 に答える