정규식 오류

정규식 오류

나는 awk를 사용하여 찾기 위해 Bash 스크립트를 사용하고 있습니다. (0010,0080)awk는 일반적으로 괄호 사이에 쉼표로 구분된 숫자 값을 찾습니다. 제가 생각할 수 있는 모든 조치를 취했지만 텍스트 파일에 추가해도 여전히 결과를 얻을 수 없습니다. 내 정규식은 다음과 같습니다

awk '/\([0-9]{4},[0-9]{4}\)/' dcmResults.txt >> ~/export/"$1"/tagResults.txt

이스케이프 문자를 사용하지 않는 것을 포함하여 대괄호에 이스케이프 문자를 사용하는 거의 모든 변형을 수행했지만 텍스트 파일에 추가할 때 결과가 없습니다. 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있나요?

업데이트하면 전체 스크립트는 다음과 같습니다.

#!/bin/bash
echo "Enter SUID: "
read uid
echo "Enter Tag Number: "
read dicomTag

dicomDump() {
        arg1=$1
        cd ~/export/"$1"
        dcmdump *.dcm > ~/export/"$1"/dcmResults.txt
}
tagFinder() {
        arg1=$1
        arg2=$2
        for i in $(cat ~/export/"$1"/dcmResults.txt); do 
            grep "$2" | awk '/[0-9]{4},[0-9]{4}.*/' dcmResults.txt >> ~/export/"$1"/tagResults.txt
        break
done;
}
dicomDump "$uid"
tagFinder "$uid" "$dicomTag"

답변1

Gnu Awk는 4.0에서 간격 표현식(사용자가 정의함)을 포함하기 시작했습니다 {4}.[0-9]

전통적으로 awk에서는 간격 표현식이 제공되지 않습니다. awk와 egrep이 서로 일관성을 갖도록 하기 위해 POSIX 표준의 일부로 추가되었습니다.

처음에는 gawk가 정규식의 간격 표현식과 일치하지 않았습니다. 이전 프로그램에서는 정규식 상수에 "{" 및 "}"를 사용할 수 있었기 때문입니다.

그러나 버전 4.0부터 gawk는 기본적으로 간격 표현식과 일치합니다. 대부분의 gawk 사용자에게는 이전 프로그램과의 호환성보다 POSIX와의 호환성이 더 중요하기 때문입니다.

정규식 상수에 "{" 및 "}"를 사용하는 프로그램의 경우 항상 백슬래시를 사용하여 이스케이프 처리하는 것이 가장 좋습니다. 그런 다음 awk.17의 모든 버전을 사용하면 정규식 상수가 유효하고 원하는 방식으로 작동합니다.

바라보다수동 입력.

답변2

이 줄을 보면 두 가지 문제가 있다고 생각됩니다.

grep "$2" | awk '/[0-9]{4},[0-9]{4}.*/' dcmResults.txt >> ~/export/"$1"/tagResults.txt
  1. 다음에서 전체 작업을 완료할 수 있습니다 grep.

    grep -e "$2" -e '([0-9]\{4\},[0-9]\{4\})' dcmResults.txt >> ~/export/"$1"/tagResults.txt
    
  2. 입력은 어디서 grep오고 출력은 어디로 가는가 grep? 입력 파일명이 있으므로 awk표준 입력을 무시합니다.

관련 정보