ackで角かっこを検索する方法

ackで角かっこを検索する方法

(検索かっこを使用したかったのですが、ackどちらも使用しても機能(しません\(

最初の項目( " (")は複数行コマンドとして認識されます。 2番目の項目( " \(")は無効な正規表現と見なされます。

検索角かっこ文字の使い方はack

エラーメッセージ

 % ack foo\(
Invalid regex 'foo(':
  Unmatched ( in regex; marked by <-- HERE in m/foo( <-- HERE / at /usr/local/bin/ack line 332.

答え1

角かっこ文字を検索するには、バックスラッシュ+角かっこをackに渡します。

バックスラッシュと括弧はシェルで特殊なので、シェルスクリプトまたはコマンドラインに入力するときは引用符で囲む必要があります。最も単純な形式の引用は、単一引用符を使用することです。これは、一重引用符自体を除くすべてを文字通り渡すようにシェルに指示します。

ack '\('

バックスラッシュを使用してシェル拡張から特殊文字を保護することもできますが、読みやすくなる傾向があります。

ack \\\(

最初のバックスラッシュはシェルの2番目のバックスラッシュを引用するため、引数の最初の文字ackはです\。 3番目のバックスラッシュは括弧を引用するため、引数の2番目の文字ackはです(。上記の一重引用符の場合と同様に、ack表示されるパラメータは2文字の文字列です\(

ack (シェルは開き括弧を見てシェル構文として扱うため、機能しません。ack \(シェルが(引数として渡され、ackackが正規表現の括弧をグループの始まりを表すと解釈するため、機能しません。

答え2

発生する正確なエラーがわかりませんが、ここではエスケープされた角かっこ(" \(")を使用してください。

 $ cat > test.c <<EOF
 int main() {
   return 0;
 }
 EOF
 $ ack '\(' test.c 
 int main() {
 $

関連情報