파일의 문자열이 정규식과 일치하는지 확인하고, 일치하지 않으면 해당 줄의 첫 번째 문자열을 인쇄합니다.

파일의 문자열이 정규식과 일치하는지 확인하고, 일치하지 않으면 해당 줄의 첫 번째 문자열을 인쇄합니다.

우선 아직 초보라서 배우는 중입니다..

데이터 세트 파일은 다음과 같습니다.

101 80 10 27598 General Tao Vancouver 01:45:10 01:46:10 00:43:00 00:59:59 01:25:10

나는 시간이 형식과 일치하는지 확인하려고 노력하고 /d/d:/d/d:/d/d있으며 해당 정규식과 일치하지 않으면 줄의 첫 번째 숫자(이 경우 101)를 인쇄합니다.

저는 CLI에서 라이너를 시도했지만 성공하지 못했습니다.

grep '/d/d:/d/d:/d/d' file.txt

그때도 아무 일도 일어나지 않았어

edit1: 데이터 세트에 01:4510 또는 이와 유사한 데이터가 있습니다.

내가 얻고 싶은 샘플 출력은 다음과 같습니다.

104 80 10 27598 BigBelly Vancouver 01:4510 01:46:10 00:43:00 00:59:59 01:25:10

답변1

십진수를 일치시키기 \d위해 정규식 연산자를 사용하는 것에 대해 생각해 보셨을 것입니다 . perl그러나 grep이를 지원하는 구현은 거의 없습니다. 표준 동등물은 입니다 [[:digit:]].

일부 grep구현 \d에서는 옵션 전달을 지원합니다 -P(기본 정규식 대신 Perl과 유사한 정규식 사용).

따라서 이를 사용하여 다음을 수행할 수 있습니다.

grep -Pv '\d\d:\d\d:\d\d' < file.txt

이 패턴과 일치하는 문자열을 포함하지 않는 행을 반환합니다.

(참고하세요.백슬래시아니요슬래시)

또는:

grep -Pv '(\s+\d\d:\d\d:\d\d){5}\s*$' < file.txt

5개의 타임스탬프로 끝나지 않는 줄의 경우.

이 경우 첫 번째 필드를 반환하려면 다음을 수행할 수 있습니다( grep지원되는 구현 사용 -o).

grep -Po '^(?!.*(\s+\d\d:\d\d:\d\d){5}\s*$)\s*\K\S+' < file.txt

이번에는 grep'를 사용하는 대신 부정적인 예측 Perl 정규식 연산자를 사용합니다 -v.

macOS grep(사용중이라고 하셨는데 지금은 삭제했어요)질문에 태그를 지정하고 다음으로 대체하세요.)는 기본 정규식에서 지원되는 몇 안 되는 정규 표현식 중 하나이지만 \d그렇지 않으므로 -P해당 연산자 (?!...)\K연산자를 사용할 수 없습니다.

표준(및 클리너)에 해당하는 것은 다음과 같습니다.

awk '!/([[:digit:]]{2}:){2}[[:digit:]]{2}/ {print $1}' < file.txt

awk사용확장 정규식이것은 또 다른 방언입니다. 간격 연산자나 문자 클래스를 포함한 일부 구현에서는 mawk여전히 지원되지 않습니다 .{2}

에서는 mawk다음을 수행합니다.

awk '!/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {print $1}' < file.txt

이는 다른 구현에서도 작동 awk하지만 일부 구현에서는 [0-9]0123456789 이외의 문자와 일치할 수 있습니다(ASCII 문자가 아니므로 입력에 문제가 없을 수 있음).

또는 마지막 5개 필드가 패턴과 일치하는지 다시 확인하세요.

awk '
  {
    for (i = 0; i < 5; i++)
      if (!($(NF-i) ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/)) {
        print $1
        next
      }
  }' < file.txt

관련 정보