나는 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
다음에서 전체 작업을 완료할 수 있습니다
grep
.grep -e "$2" -e '([0-9]\{4\},[0-9]\{4\})' dcmResults.txt >> ~/export/"$1"/tagResults.txt
- 입력은 어디서
grep
오고 출력은 어디로 가는가grep
? 입력 파일명이 있으므로awk
표준 입력을 무시합니다.