正则表达式出错了

正则表达式出错了

我正在使用 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
  1. 您可以在以下位置完成整个操作grep

    grep -e "$2" -e '([0-9]\{4\},[0-9]\{4\})' dcmResults.txt >> ~/export/"$1"/tagResults.txt
    
  2. 它的输入从哪里grep得到,输出又到哪里去grep?由于awk有输入文件名,因此它将忽略标准输入。

相关内容