![-bash: 미리보기 및 되돌아보기를 사용할 때 예기치 않은 표시 "(" 근처에 구문 오류가 있습니까?](https://linux55.com/image/205983/-bash%3A%20%EB%AF%B8%EB%A6%AC%EB%B3%B4%EA%B8%B0%20%EB%B0%8F%20%EB%90%98%EB%8F%8C%EC%95%84%EB%B3%B4%EA%B8%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EC%98%88%EA%B8%B0%EC%B9%98%20%EC%95%8A%EC%9D%80%20%ED%91%9C%EC%8B%9C%20%22(%22%20%EA%B7%BC%EC%B2%98%EC%97%90%20%EA%B5%AC%EB%AC%B8%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
사용 사례는 매우 간단합니다. 다음 이름의 텍스트 파일이 있습니다 eg.txt
.
'simple_example': 345, 'to_demonstrate': 232,
'regex': '사용하기 쉽지 않음'
키를 캡처하려고 합니다.
grep -oP (?<=')[a-zA-Z_0-9]+(?=':) eg.txt
오류가 발생합니다.
-bash: 예상치 못한 표시 "(" 근처에서 구문 오류가 발생했습니다.
작은따옴표를 이스케이프 처리해도 도움이 되지 않습니다.
grep -oP (?<=\')[a-zA-Z_0-9]+(?=\':) eg.txt
확장 grep을 사용해도 도움이 되지 않습니다.
grep -oE (?<=')[a-zA-Z_0-9]+(?=':) eg.txt
여기서 무슨 일이 일어나고 있는 걸까요? 저는 Windows 10 WSL에서 Linux bash를 사용하고 있습니다.
답변1
오류 메시지가 해결하는 문제는 작은따옴표가 아니라 괄호입니다. 인용되지 않은 괄호는 셸에 특별하며 그 의미는 명령줄에서의 위치에 따라 달라집니다. 따옴표가 없는 작은따옴표와 입력 리디렉션 연산자 <
는반품문제가 있으므로 쉘이 이를 쉘 구문으로 해석하지 못하도록 전체 정규식을 인용하는 것이 좋습니다.
grep -P -o "(?<=')[a-zA-Z_0-9]+(?=':)" eg.txt
표현식에 작은따옴표가 포함되어 있고 작은따옴표로 묶인 문자열에는 작은따옴표가 포함될 수 없으므로 큰따옴표를 사용하여 전체 표현식을 인용했습니다.
입력이 올바른 형식의 JSON 문서인 경우(키와 값에 큰따옴표 사용) JSON 구문 분석기를 사용하여 최상위 키를 가져오는 것이 더 쉽습니다. 예를 들면 다음과 같습니다 jq
.
$ cat file
{
"simple_example": 345,
"to_demonstrate": 232,
"regex": "is not easy to use"
}
$ jq -r 'keys[]' file
regex
simple_example
to_demonstrate
이는 최상위 키를 배열로 추출한 다음( 사용하여 keys
) 해당 배열을 컬렉션으로 확장한 다음 []
출력 디코딩됩니다(즉, 인코딩된 JSON 문자열이 아닌 "원시" 문자열로 -r
).