정규식 - 터미널에서 명령을 찾을 수 없습니다.

정규식 - 터미널에서 명령을 찾을 수 없습니다.

잡으려고 노력 중이야내 이름369file.txt에서 이 줄을 정규식으로 grep했지만 오류가 반환되었습니다. 을 사용해 보았지만 egrep성공하지 못했습니다.

입력하다:

  1. 내 이름 369 == 일치
  2. 내 이름 161 == 일치
  3. my_name 123 2 != 오류

실수: ?!.: command not found

이것은 내가 실행하려는 코드이며 작동합니다.정규 표현식 101

grep -i "^\s*my_name\s+[0-9]+\s*$(?!.)*" file.txt

답변1

당신이 원하는 것 같습니다 :

grep -Ex '[[:space:]]*my_name[[:space:]]+[0123456789]+[[:space:]]*' file.txt
  • 큰따옴표 내에서는 이라는 $(cmd)출력으로 확장됩니다 cmd.명령 대체아직 실행 중입니다. 여기서는 ?!.명령의 출력을 얻으려고 하지만 명령이 존재하지 않으므로 오류가 발생합니다. 많은 정규식 연산자가 셸에서도 특별한 의미를 갖기 때문에 이스케이프되므로 작은따옴표를 사용하여 인용하는 것이 가장 좋습니다.모든쉘 문자.
  • \s그리고 (?!.)진주정규식 연산자. 현재 일부 grep구현에서는 이를 지원하지만 \s(표준의 약식으로 ) 70년대 초반에 도입된 이후 처럼 리터럴 일치가 필요하기 때문에 부정 예측 연산자를 [[:space:]]지원할 수 없습니다 . 표준 ERE(확장 정규 표현식) 가 지정되지 않았기 때문에 이를 식별하기 위해 (90년대 초반 POSIX에 의해 도입된)을 사용할 수 있습니다 . ast-open의 구현이 이를 수행하지만 이것이 내가 아는 유일한 것입니다. 어떤 경우든 나중에 항목을 추가하는 것은 의미가 없습니다 (주제의 끝 부분과 일치하도록 의도됨). 또한 (귀하의 경우) 둘러보기 연산자 뒤에 수량자를 추가하는 것도 의미가 없습니다.(?!.)(?!(?!grep-E(?...Egrep$*
  • +BRE 연산자가 아닌 ERE 또는 Perl RE 연산자입니다. BRE에 해당하는 것은 \{1,\}.
  • [0-9]0123456789 ASCII 아랍어 숫자와 일치하지만 일반적으로 정확히 0과 9 사이에 정렬된 더 많은(일반적으로 숫자 관련) 문자가 있습니다. (입력 유효성 검사를 수행할 때와 같이) 0123456789만 일치시키려는 경우 정확한 목록을 지정해야 합니다.
  • -x전체 라인에 맞게 추가하면 앵커 포인트 ^를 사용하는 번거로움이 줄어듭니다 $.
  • -i대소문자를 구분하지 않는 일치에 사용됩니다. 그것으로 MY_NAME, My_NaMe도 받아들여질 것입니다.
  • 타이핑이 장식적인 것보다 짧기 -E때문에 위에서 사용했습니다 . 여기서 ERE를 반드시 사용할 필요는 없습니다.+\{1,\}
  • do의 일부 구현에서는 일치를 위해 Perl과 유사한 정규식을 사용하는 옵션을 grep지원합니다 . -P이것으로 당신은 그것을 할 수 있습니다 grep -Px '\s*my_name\s+\d+\s*'. \d십진수와 일치하도록 설계되었습니다. 제가 시도한 GNU 버전에서는 grep0123456789와만 일치하지만 이것이 모든 버전과 구현에 적용된다고 보장할 수는 없습니다. 예를 들어 grep -Px '(*UCP)\d'( U니코드 C문자 속성의 경우) P더 많은 십진수 문자를 일치시키는 방법을 참조하세요. [0123456789]안전을 위해 여전히 거기에서 사용하고 싶을 수도 있습니다 .

또 다른 방법은 다음을 사용 awk하고 실행하는 것입니다.

awk 'NF == 2 && $1 == "my_name" && $2 ~ /^[0123456789]+$/'

N더 명확하게 지정하려면 두 개의 필드( 필드 수가 2 인 경우)가 있는 행을 원합니다 F. 첫 번째 필드는 my_name이고 두 번째 필드는 ASCII 10진수로만 구성됩니다. 기본적으로 필드는 공백(와 유사 [[:blank:]])으로 구분되지만 일부 awk구현에서는 공백과 탭만 고려하고 일부는 [[:space:]]/ \sdo와 같은 세로 간격 문자도 고려합니다.

대소문자를 구분하지 않는 일치의 경우 다음을 수행합니다 tolower($1) == "my_name". GNU 구현을 awk전달하여 모든 정규식 일치 항목에 대해 대소문자를 구분하지 않는 일치를 수행할 수 있습니다 -v IGNORECASE=1.


1 기술적으로는 ?!.쉘 글로브이자 ?글로브 연산자이기도 합니다. a!.따라서 현재 작업 디렉터리에 호출된 파일이 있으면 b!.해당 파일이 해당 파일로 확장되고 a!.인수로 명령을 실행하려고 시도합니다. b!.zsh 또는 Fish( 의 옵션 참조 failglob) 와 같은 보다 정상적인 셸을 사용하면 bash일치하는 파일이 없으면 오류가 발생합니다.?!.

관련 정보