우선 아직 초보라서 배우는 중입니다..
데이터 세트 파일은 다음과 같습니다.
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