(
검색 괄호를 사용하고 싶었지만 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 \(
쉘이 (
인수로 전달되고 ack
ack가 정규식의 괄호를 그룹의 시작을 나타내는 것으로 해석하기 때문에 작동하지 않습니다.
답변2
발생하는 정확한 오류를 모르지만 여기서는 이스케이프된 대괄호(" \(
") 를 사용합니다.
$ cat > test.c <<EOF
int main() {
return 0;
}
EOF
$ ack '\(' test.c
int main() {
$