Capture apenas a parte numérica com regex de sed

0

Por que o seguinte não funciona?

INTERNAL_NUM=$(grep -E '\s*internal_num\s*=' file.xml |sed -E 's/internal_num\s*=\s*([0-9]\+)//') 
echo "$INTERNAL_NUM"

Eu gostaria de imprimir o número real, mas ele imprime:

internal_num = 1234 

O comando grep imprime internal_num = 1234 para que a parte esteja bem. É o pipe para sed que não funciona.

    
por Jim 20.03.2018 / 15:25

3 respostas

2

Se você tem o GNU grep, você pode escrever

grep -oP '\binternal_num\s*=\s*\K\d+' file.xml

Mas você não deve analisar XML com expressões regulares. Talvez você precise de algo assim

$ echo '
      <root>
          <tag>
              <tag>
                  <wanted internal_num="1234" />
                  <wanted internal_num = "5678" />
              </tag>
          </tag>
      </root>
  ' | xmlstarlet sel -t -v '//@internal_num' -n
1234
5678

Por favor, mostre seu arquivo de entrada.

    
por 20.03.2018 / 15:34
1

Diferentes ferramentas e implementações / versões de uma determinada ferramenta suportam diferentes sintaxes de expressões regulares.

Para ser portátil, você pode se limitar ao conjunto de recursos POSIX:

s=[[:space:]]
sed -n "s/^\(.*$s\)\{0,1\}internal_num$s*=$s*\([0-9]\{1,\}\).*//p"

(assumindo que há apenas uma ocorrência por linha)

Se você sabe que só vai executá-lo em sistemas em que grep suporta -o e -P (para expressões regulares semelhantes a perl) à la GNU grep , você pode fazer:

grep -Po '(?<!\S)internal_num\s*=\s*\K\d+'
    
por 20.03.2018 / 16:01
1

Você está usando a regex estendida, mas ainda está escapando de \+ , portanto, procura por um sinal de adição literal e não chama a substituição.

Tente,

INTERNAL_NUM=$(grep -E '\s*internal_num\s*=' file.xml |sed -E 's/internal_num\s*=\s*([0-9]+)//') 
echo "$INTERNAL_NUM"

Testcases (testados no GNU sed V4.2.1):

$ echo "internal_num = 1234" | sed -E 's/internal_num\s*=\s*([0-9]\+)//'
internal_num = 1234

$ echo "internal_num = 1234" | sed -E 's/internal_num\s*=\s*([0-9]+)//'
1234

Como outras respostas mencionam (e explicam em detalhes), você deve considerar seriamente não usar o regex para analisar o XML.

    
por 20.03.2018 / 15:38