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

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

回答

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

括弧で囲まれた式、[...]内では、

特別"(]-^、および3つの組み合わせ[=[:および[.)。 ][...]に含める場合は、]を最初に指定する必要があります(おそらく

)。対称性のために、]を最初に、[を最後に配置することを選択しました。

他に覚えておくべきことは一重引用符で囲まれた文字列に一重引用符を含めることはできないため、式の前後に二重引用符を使用します。二重引用符で囲まれた文字列を使用しているため、シェルは拡張するためにその中を突っ込みます。このため、$\$としてエスケープします。これにより、シェルはリテラル$からgrepに移動し、!\!としてエスケープします。 bashでの展開(ただし、インタラクティブなbashシェルでのみ)。

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

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


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

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

ここで、]は、単一引用符で囲まれた文字列に単一引用符を含めることはできないため、代わりに3つの文字列の連結を使用します。

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

別のアプローチは、POSIX文字クラス[[:punct:]]を使用することです。これは、セット!"#$%&"()*+,-./:;<=>?@[\]^_`{|}~の1文字と一致します。これは、質問で指定されたものよりも大きいセットです(さらに)ですが、POSIXが定義するすべての"句読文字"です。

LC_ALL=C grep "[[:punct:]]" 

コメント

  • @ilkkachu私は'を見つけませんでした$あります!ありがとうございます!
  • コマンドを実行しようとすると、このエラーが発生しますbash: !\: event not found
  • @ user9371654 Darn bash!:-) !もエスケープします… ユーザーそれを忘れました。更新します…
  • "[\!]"[\!]に展開されます履歴拡張が有効になっている場合でも、バックスラッシュで一致します。'一重引用符が必要であるか、\! outsiを使用する必要があります。引用符で囲みます。
  • 'はbashzshには、cshから継承された厄介な機能もあります。 cshでは、!'...'内でも特別であり、非対話型の場合も同様です。ただし、csh(bashまたはzshとは異なります)では、"\!"を使用するとここで機能します(バックスラッシュは削除されます)。

回答

次の場合は、[:punct:]文字クラスを使用できます。他の句読点や特殊文字とも一致することを気にしないでください:

grep "[[:punct:]]" file 

コメント

  • punct文字クラス(マクロではない)は、Cロケールの!"#$%&'()*+,-./:;<=>?@[\]^_ {|}〜 `と一致します。これは、Cロケールよりも少し大きい文字セットです。ユーザーが持っているものですが、それで十分かもしれません。

回答

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

これはPerl正規表現を使用し、-Pオプションを指定してGNUgrepで使用できます。

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

2 backslが必要であることに注意してくださいドル記号の前にある灰は、シェルで特別な意味を持っているため、最初の円記号はシェルのためにそれをエスケープします。 (前にバックスラッシュが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) 

コメント

  • いいえ、標準のEREでは、'終了を回避できません]バックスラッシュ付き。バックスラッシュは、括弧内の式では特別なものではありません。角かっこ式内に]を含めるには、最初に[ot\]her][]other]にする必要があります。 div>。その'は、regex101がデフォルトで記述するPCREとは異なります。
  • pcregrepまたはGNU