私はこれを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
。以下を使用してください。
-z
grep
改行の代わりに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形式)を使用してください。