次の文字のいずれかを含む行を検索したい:
:
/
/
?
#
[
]
@
!
$
&
"
(
)
*
+
,
;
=
%
回答
grep "[]:/?#@\!\$&"()*+,;=%[]"
括弧で囲まれた式、[...]
内では、
特別"(]
、-
と^
、および3つの組み合わせ[=
、[:
および[.
)。 ]
を[...]
に含める場合は、]
を最初に指定する必要があります(おそらく
)。対称性のために、]
を最初に、[
を最後に配置することを選択しました。
他に覚えておくべきことは一重引用符で囲まれた文字列に一重引用符を含めることはできないため、式の前後に二重引用符を使用します。二重引用符で囲まれた文字列を使用しているため、シェルは拡張するためにその中を突っ込みます。このため、$
を\$
としてエスケープします。これにより、シェルはリテラル$
からgrep
に移動し、!
を\!
としてエスケープします。 bash
での展開(ただし、インタラクティブなbash
シェルでのみ)。
バックスラッシュを含めるか設定すると、シェルがgrep
に単一のバックスラッシュを与えるように、\\
としてエスケープする必要があります。また、含める場合はバックティック`
の場合、コマンド置換を開始するため、\`
としてエスケープする必要があります。
コマンド上記は、括弧で囲まれた式に少なくとも1つの文字を含む行を抽出します。
二重引用符で囲まれた文字列の代わりに一重引用符で囲まれた文字列を使用すると、ほとんどの煩わしさが回避されます。シェルが解釈する文字:
grep "[]:/?#@!$&"""""()*+,;=%[]"
ここで、]
は、単一引用符で囲まれた文字列に単一引用符を含めることはできないため、代わりに3つの文字列の連結を使用します。
-
"[]:/?#@!$&"
-
"""
-
"()*+,;=%[]"
別のアプローチは、POSIX文字クラス[[:punct:]]
を使用することです。これは、セット!"#$%&"()*+,-./:;<=>?@[\]^_`{|}~
の1文字と一致します。これは、質問で指定されたものよりも大きいセットです(さらに)ですが、POSIXが定義するすべての"句読文字"です。
LC_ALL=C grep "[[:punct:]]"
コメント
完全な正規表現を使用して検索できます特殊文字である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)
コメント
$
あります!ありがとうございます!bash: !\: event not found
。bash
!:-)!
もエスケープします… ユーザーそれを忘れました。更新します…"[\!]"
は[\!]
に展開されます履歴拡張が有効になっている場合でも、バックスラッシュで一致します。'一重引用符が必要であるか、\!
outsiを使用する必要があります。引用符で囲みます。bash
、zsh
には、cshから継承された厄介な機能もあります。 cshでは、!
は'...'
内でも特別であり、非対話型の場合も同様です。ただし、csh
(bashまたはzshとは異なります)では、"\!"
を使用するとここで機能します(バックスラッシュは削除されます)。