web-dev-qa-db-ja.com

grepを使用して特殊文字を検索する

次の文字を含む行を検索したい:

://?#[]@!$&'()*+,;=%

6
user9371654
_grep "[]:/?#@\!\$&'()*+,;=%[]"
_

括弧で囲まれた式_[...]_内では、「特殊」な文字はほとんどありません(_]_、_-_と_^_、および_[=_、_[:_および_[._)。 _]_を_[...]_に含める場合、_]_を最初に(おそらく_^_の後に)置く必要があります。対称性のために、_]_を最初に、_[_を最後に置くことにしました。

覚えておくべき他の唯一のことは、単一引用符で囲まれた文字列には単一引用符を含めることができないため、式を二重引用符で囲むことです。二重引用符で囲まれた文字列を使用しているので、シェルは展開するためにその文字列をたどります。このため、_$_を_\$_としてエスケープして、シェルに_$_をgrepにリテラルさせ、_!_を_\!_もbashの履歴拡張であるため(ただし、インタラクティブなbashシェルでのみ)。

セットにバックスラッシュを含めたい場合は、シェルをgrepに単一のバックスラッシュを与えるように、_\\_としてエスケープする必要があります。また、バックティック_`_を含める場合は、それも_\`_としてエスケープする必要があります。そうしないと、コマンド置換が開始されます。

上記のコマンドは、括弧で囲まれた式の文字の少なくとも1つを含む行を抽出します。


二重引用符で囲まれた文字列の代わりに単一引用符で囲まれた文字列を使用すると、シェルが解釈する文字のほとんどの煩わしさを回避できます。

_grep '[]:/?#@!$&'"'"'()*+,;=%[]'
_

ここで、_]_の配置を除いて、覚えておくべき唯一のことは、単一引用符で囲まれた文字列には単一引用符を含めることができないため、代わりに3つの文字列の連結を使用します。

  1. _'[]:/?#@!$&'_
  2. _"'"_
  3. '()*+,;=%[]'
8
Kusalananda

他の句読点や特殊文字にも一致する場合は、[:punct:]文字クラスを使用できます。

grep '[[:punct:]]' file
5
Alexander

特殊文字である1文字を検索する場合は、完全な正規表現を使用して角かっこ内の特殊文字を検索できます。正規表現の練習、学習、チェックに役立つリソースは regex101.com です。

これはPerl正規表現を使用します。これはGNU grep with -Pオプション:

grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"
                            ^^^

ドル記号の前には2つのバックスラッシュが必要です。シェルでは特別な意味があり、最初のバックスラッシュはシェルではエスケープされます。 (前にバックスラッシュが1つだけあると、シェルはバックスラッシュを削除し、grepはエスケープされていないドル記号を行末を意味し、任意の入力行と一致します。)

端末が色をサポートしている場合は、色も同様にスローします。

grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"

これが regex101.com の私の正規表現の説明です

/(\:|\/|\?|\#|\@|\!|\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])/gm
1st Capturing Group (\:|\/|\?|\#|\@|\!|\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])
  \: matches the character : literally (case sensitive)
  \/ matches the character / literally (case sensitive)
  \? matches the character ? literally (case sensitive)
  \# matches the character # literally (case sensitive)
  \@ matches the character @ literally (case sensitive)
  \! matches the character ! literally (case sensitive)
  \$ matches the character $ literally (case sensitive)
  \& matches the character & literally (case sensitive)
  \' matches the character ' literally (case sensitive)
  \( matches the character ( literally (case sensitive)
  \) matches the character ) literally (case sensitive)
  \* matches the character * literally (case sensitive)
  \+ matches the character + literally (case sensitive)
  \, matches the character , literally (case sensitive)
  \; matches the character ; literally (case sensitive)
  \= matches the character = literally (case sensitive)
  \% matches the character % literally (case sensitive)
  \[ matches the character [ literally (case sensitive)
  \] matches the character ] literally (case sensitive)
4
thebtm