次の文字を含む行を検索したいと思います。
:
/
/
?
#
[
]
@
!
$
&
'
(
)
*
+
,
;
=
%
ベストアンサー1
grep "[]:/?#@\!\$&'()*+,;=%[]"
角括弧式では、「特殊」文字はほとんどありません(、、、、、、、の3つの組み合わせ[...]
など、非常に小さいサブセットのみ)。 inを含む場合は、最初に来る必要があります(おそらくaの後ろ)。対称のために最初と最後を配置することにしました。]
-
^
[=
[:
[.
]
[...]
]
^
]
[
覚えておくべきもう一つのことは、一重引用符で囲まれた文字列に一重引用符を含めることができないため、式の周りに二重引用符を使用することです。二重引用符で囲まれた文字列を使用しているため、シェルは拡張のためにその中を移動します。このため、$
asをエスケープし\$
てシェルにリテラル値を提供させ、asもエスケープします。$
これはinの歴史的拡張であるからです(対話型シェルでのみ可能です)。grep
!
\!
bash
bash
コレクションにバックスラッシュを含めるには、\\
シェルが単一のバックスラッシュを提供するようにエスケープする必要がありますgrep
。また、バックティックを含めるには、`
バックティックもエスケープする必要があります。\`
それ以外の場合は、コマンド置換が開始されます。
上記のコマンドは、角かっこ式の文字の 1 つ以上を含むすべての行を抽出します。
二重引用符で囲まれた文字列の代わりに単一引用符で囲まれた文字列を使用すると、文字を解釈するシェルの問題のほとんどを解決できます。
grep '[]:/?#@!$&'"'"'()*+,;=%[]'
ここで覚えておくべき唯一のことは、の配置に加えて]
一重引用符で囲まれた文字列に一重引用符を含めることはできないため、3つの文字列を連結する方法を使用することです。
'[]:/?#@!$&'
"'"
'()*+,;=%[]'
別のアプローチは、POSIX文字クラスを使用することです[[:punct:]]
。これはsetの単一文字と一致します!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
。大きい設定は質問に提供されているよりも大きいが(含まれています"-.<>^_`{|}~
)、POSIXで定義されているすべての「句読点」です。
LC_ALL=C grep '[[:punct:]]'