Regex ido Errado

0

Estou usando um script Bash para usar o awk para procurar: (0010,0080) O awk geralmente procura por qualquer valor numérico separado por uma vírgula entre parênteses. Eu fiz tudo o que posso pensar e ainda não consigo obter qualquer resultado quando eu anexá-lo a um arquivo de texto). Meu regex é:

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

Eu fiz quase todas as variações de uso de um caractere de escape para o parêntese, incluindo não usar nenhum, e não obtenho resultados quando anexando a um arquivo de texto. Alguém pode me dizer o que estou fazendo errado?

UPDATE, aqui está o script inteiro:

#!/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"
    
por ryekayo 12.12.2014 / 22:04

2 respostas

2

O Gnu Awk só começou a incluir expressões de intervalo (seu {4} qualifica o [0-9] ) em 4.0:

Interval expressions were not traditionally available in awk. They were added as part of the POSIX standard to make awk and egrep consistent with each other.

Initially, because old programs may use ‘{’ and ‘}’ in regexp constants, gawk did not match interval expressions in regexps.

However, beginning with version 4.0, gawk does match interval expressions by default. This is because compatibility with POSIX has become more important to most gawk users than compatibility with old programs.

For programs that use ‘{’ and ‘}’ in regexp constants, it is good practice to always escape them with a backslash. Then the regexp constants are valid and work the way you want them to, using any version of awk.17

Veja a entrada manual .

    
por 12.12.2014 / 22:27
1

Esta linha parece ter dois problemas:

grep "$2" | awk '/[0-9]{4},[0-9]{4}.*/' dcmResults.txt >> ~/export/"$1"/tagResults.txt
  1. Você pode fazer tudo em grep :

    grep -e "$2" -e '([0-9]\{4\},[0-9]\{4\})' dcmResults.txt >> ~/export/"$1"/tagResults.txt
    
  2. Onde está grep obtendo sua entrada e para onde vai a saída de grep ? Como awk tem um nome de arquivo para entrada, ele ignoraria a entrada padrão.
por 12.12.2014 / 22:31