다음과 같은 줄을 사용하여 쉼표 나 대시로 구분된 5자리 숫자가 포함된 파일을 구문 분석하고 싶습니다.
내 목표는 형식이 잘못된 줄을 찾는 것입니다. 쉼표나 대시 이외의 문자로 구분된 5자리 이외의 숫자가 포함된 줄입니다.
다음 명령을 사용하여 파일을 egrep하려고했습니다.
cat file.txt | egrep -v [-,]*[0-9]{5}[,-]*
- 하지만 6자리 숫자가 있으면 일치하고 해당 줄이 표시되지 않습니다.
- 4자리 숫자가 있으면 일치하지 않지만 같은 행의 다른 숫자는 일치하고 행이 표시되지 않습니다.
행 내용을 지정하려면 다음을 수행합니다.
- 번호는 5자리여야 합니다.
- 범위는 대시로 정의됩니다(예: 12345-12389).
- 한 줄에는 단일 숫자부터 여러 숫자 및 범위까지 어떤 순서로든 포함될 수 있습니다.
어떤 제안이 있으십니까?
답변1
grep -vxE '([0-9]{5}[,-])*[0-9]{5}'
잘못된 행이 보고됩니다.
또는 비활성화하려는 경우 12345-12345-12345
:
num='[0-9]{5}'
num_or_range="$num(-$num)?"
grep -vxE "($num_or_range,)*$num_or_range"
답변2
좋은 grep
솔루션을 보려면 다음을 참조하세요.스티븐의 대답. 대안으로 Perl 버전은 다음과 같습니다.
perl -ne 'print if grep{$_!~/^\d{5}$/} split(/[,-]/); ' file
,
이는 각 입력 라인을 분할하거나 -
5개의 숫자를 포함하지 않는 분할 배열의 구성원을 찾습니다. 발견되면 해당 행을 인쇄하십시오.
답변3
당신은 필요하지 않습니다 cat
. 귀하의 요구 사항을 충족합니까?
$ grep -v -E '^([0-9]{5}(,|-))+' <FILE>
예를 들어 FILE
다음과 같은 경우가 있습니다.
12345,23456,34567-45678,12345-23456,34567
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234*23456,34567-45678,12345-23456,34567
결과는 다음과 같습니다:
$ grep -v -E '^([0-9]{5}(,|-))+' 5d
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234-23456,34567-45678,12345-23456,34567