正規表現でLF文字を処理するためにGNU grep 2.12を取得できません

正規表現でLF文字を処理するためにGNU grep 2.12を取得できません

私はこれを1時間以上調べてきましたが、なぜ動作しないのかわかりません。

HTML文書で「\nSome text」を検索しています。十分簡単です。

しかし、彼が実行したコマンドは機能しません。

grep -Po '(?s)<h2>\nSome text' input.html > output.html
grep -Po '(?s)<h2>\\nSome text' input.html > output.html

grepのデフォルトの正規表現エンジンは複数行をサポートしていないため、「-P」スイッチが必要です。

私は何をもっと試すべきかわかりません。どんなアイデアがありますか?

ありがとうございます。

- 編集:入力ファイルには次の項目のみが含まれます。

<h2>LF (ie. \n)
Some text

答え1

改行(したがって複数行)を一致させるには2つの方法が必要ですgrep。以下を使用してください。

  • -zgrep改行の代わりにASCII NULで行を区切る最新のGNUオプション

  • (?s)DOTALL修飾子(grep -P)と呼ばれ、結果としてgrep改行文字(LF / CR)と一致.(ドット)されます。

したがって、あなたの場合は、次のように動作します。

grep -aPoz '(?s)<h2>.Some text' file.txt

新しい行がここで.一致します。

CRとLFがあるかどうかわからない場合:

grep -aPoz '(?s)<h2>.{1,2}Some text' file.txt

grep最初の数バイトを読み取ってファイルの種類を決定するので、ファイルはバイナリファイルとして扱われ、ファイルはテキストファイルとして扱われますgrep-a

答え2

grepはデフォルトで行を検索するため、通常は行間の文字を見つけるためには使用できません。

改行文字を検索するときは、通常、改行文字(ここではUNIX改行文字であると仮定)を次のようにテキストにない他の文字に置き換えます。

cat file.html | sed 's/\n/%\n/g' | grep '<h2>%' | tr --delete % 

しかし、私が見るには行末で検索しているようです。次のように検索できます。

grep '<h2>$' file.html > newfile.html

$これは、行の終わりと一致する正規^表現(7)であるためです。

編集:私が間違っている場合(私が疑う場合)、<h2>\nSome text次のようにしてください。

cat file.html | sed 's/<h2>\n/ñ/g' | grep 'ñSome text' | sed 's/ñ/<h2>\n/g' > newfile.html

ñテキストの実際のsとは異なる文字(UTF-8シーケンス)を使用してください。ñ

または、次の組み合わせを試してください。

cat file.html | tr \\n % | sed 's/<h2>%/ñ/g' | tr % \\n | grep 'ñSome text' | sed 's/ñ/<h2>\n/g'

%ファイルでは使用されないため、単一文字(UTF-8形式)を使用してください。

関連情報