-bash: 미리보기 및 되돌아보기를 사용할 때 예기치 않은 표시 "(" 근처에 구문 오류가 있습니까?

-bash: 미리보기 및 되돌아보기를 사용할 때 예기치 않은 표시 "(" 근처에 구문 오류가 있습니까?

사용 사례는 매우 간단합니다. 다음 이름의 텍스트 파일이 있습니다 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).

관련 정보