次の文字を含む行を検索したいと思います。
:
/
/
?
#
[
]
@
!
$
&
'
(
)
*
+
,
;
=
%
答え1
grep "[]:/?#@\!\$&'()*+,;=%[]"
角括弧式では、「特殊」文字はほとんどありません(、、、、、、、の3つの組み合わせ[...]
など、非常に小さいサブセットのみ)。 inを含む場合は、最初に来る必要があります(おそらくaの後ろ)。対称のために最初と最後を配置することにしました。]
-
^
[=
[:
[.
]
[...]
]
^
]
[
覚えておくべきもう一つのことは、一重引用符で囲まれた文字列に一重引用符を含めることができないため、式の周りに二重引用符を使用することです。二重引用符で囲まれた文字列を使用しているため、シェルは拡張のためにその中を移動します。このため、$
asをエスケープし\$
てシェルにリテラル値を提供させ、asもエスケープします。$
これはinの歴史的拡張であるからです(対話型シェルでのみ可能です)。grep
!
\!
bash
bash
コレクションにバックスラッシュを含めるには、\\
シェルが単一のバックスラッシュを提供するようにエスケープする必要がありますgrep
。また、バックティックを含めるには、`
バックティックもエスケープする必要があります。\`
それ以外の場合は、コマンド置換が開始されます。
上記のコマンドは、角かっこ式の文字の 1 つ以上を含むすべての行を抽出します。
二重引用符で囲まれた文字列の代わりに単一引用符で囲まれた文字列を使用すると、文字を解釈するシェルの問題のほとんどを解決できます。
grep '[]:/?#@!$&'"'"'()*+,;=%[]'
ここで覚えておくべき唯一のことは、の配置に加えて]
一重引用符で囲まれた文字列に一重引用符を含めることはできないため、3つの文字列を連結する方法を使用することです。
'[]:/?#@!$&'
"'"
'()*+,;=%[]'
別のアプローチは、POSIX文字クラスを使用することです[[:punct:]]
。これはsetの単一文字と一致します!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
。大きい設定は質問に提供されているよりも大きいが(含まれています"-.<>^_`{|}~
)、POSIXで定義されているすべての「句読点」です。
LC_ALL=C grep '[[:punct:]]'
答え2
[:punct:]
他の句読点や特殊文字とも一致することが気に入らない場合は、文字クラスを使用できます。
grep '[[:punct:]]' file
答え3
特殊文字である文字を見つける場合は、完全正規表現を使用して角かっこ内の特殊文字を見つけることができます。正規表現を練習、学習、確認するための優れたリソースは次のとおりです。正規表現101.com。
これは、次のオプションと一緒にGNU grepで使用できるPerl正規表現を使用します-P
。
grep -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"
^^^
必要な点を参考にしてください二つドル記号の前のバックスラッシュはシェルで特別な意味を持つため、最初のバックスラッシュはシェルからエスケープされます。(前にバックスラッシュがある場合、シェルはバックスラッシュを削除し、grep
エスケープされていないドル記号をチェックして行の終わりを示し、すべての入力行と一致します。)
端末でサポートされている場合は、色を追加することもできます。
grep --color=auto -P "(\:|\/|\?|\#|\@|\!|\\$|\&|\'|\(|\)|\*|\+|\,|\;|\=|\%|\[|\])"
私の正規表現の説明は次のとおりです。正規表現101.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)