ack를 통해 대괄호를 검색하는 방법

ack를 통해 대괄호를 검색하는 방법

(검색 괄호를 사용하고 싶었지만 ack둘 다 사용하지도 작동 (하지도 않습니다 \(.

첫 번째 항목(" (")은 여러 줄 명령으로 인식됩니다. 두 번째 항목(" \(")은 유효하지 않은 정규식으로 간주됩니다.

검색 대괄호 문자를 사용하는 방법은 무엇입니까 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 \\\(

첫 번째 백슬래시는 셸에서 두 번째 백슬래시를 인용하므로 인수의 첫 번째 문자 ack는 입니다 \. 세 번째 백슬래시는 괄호를 인용하므로 인수의 두 번째 문자 ack는 입니다 (. 위의 작은따옴표의 경우와 마찬가지로 ack표시되는 매개변수는 2문자 문자열입니다 \(.

ack (쉘은 여는 괄호를 보고 이를 쉘 구문으로 처리하기 때문에 작동하지 않습니다. ack \(쉘이 (인수로 전달되고 ackack가 정규식의 괄호를 그룹의 시작을 나타내는 것으로 해석하기 때문에 작동하지 않습니다.

답변2

발생하는 정확한 오류를 모르지만 여기서는 이스케이프된 대괄호(" \(") 를 사용합니다.

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

관련 정보