我正在使用 Bash 脚本来使用 awk 来查找:(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 中不提供区间表达式。它们被添加为 POSIX 标准的一部分,以使 awk 和 egrep 彼此一致。
最初,由于旧程序可能在正则表达式常量中使用“{”和“}”,因此 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
有输入文件名,因此它将忽略标准输入。