このgrepステートメントが私が期待したものと反対の効果を持つのはなぜですか?

このgrepステートメントが私が期待したものと反対の効果を持つのはなぜですか?

いくつかのHTMLといくつかのテキストが混在するファイルがあり、テキスト行のみが必要です。

私はgrepHTMLタグで始まる行、さらにはタグの前にスペースを含む行を除外する方法を見つけようとしています。

どういうわけかこれは私にとって効果的ですが、それをしてはいけないと思います。

grep '^\<' file.htm

HTMLのない行のみを表示します。理由を説明できますか?私の考えでは、このことができる場所grep -vが必要だと思います.*

ベストアンサー1

~からGNUgrepマニュアル:

\<
単語の先頭の空の文字列と一致します。

\>
単語の末尾の空の文字列と一致します。

これも関連しています[強調鉱山]:

-w
--word-regexp
単語全体を構成する項目を含む行のみを選択してください。テストでは、一致する部分文字列が行の先頭にあるか、単語を作成しない文字が前にある必要があります。繰り返しますが、行の末尾にあるか、単語を形成しない文字が後に続く必要があります。単語を構成する文字は、文字、数字、下線です。[… ]

このオプションは、単語コンポーネントで始まり、終わらない部分文字列と一致する可能性があるため、周囲の正規表現とは-w異なります。たとえば、埋め込まれた行だけが一致しても単語コンポーネントではないため、どの行とも一致できません。 [… ]\<\>grep -w @@grep '\<@\>'@

完全性のために:

キャレット^とドル記号は、$それぞれ行の先頭と末尾の空の文字列と一致するメタ文字です。一致を各行の先頭または末尾に「固定」するため、アンカーポイントと呼ばれます。

使用するパターン(^\<)は、単語を構成する文字の前の行の先頭に一致します。文字やスペースは<単語の一部ではありません。

行の先頭のスペースは一致をトリガーしません。にもかかわらず裏面にラベルや何かがある場合。テキスト行に有効な特定の文字(たとえば()も一致をトリガーしません。

おすすめ記事