BASH - grep - funciona na linha de comando, mas não no script

2

Estou tentando obter o número de ocorrências em um script e, ao executar o comando na linha de comando, ele funciona bem, mas não em um script. Ambas as variáveis são inicializadas. FILE_PATH é o caminho absoluto do arquivo e VARIABLE_NAME é algo como firstName ou lastName.

VARIABLE_NAME="_firstName"    
grep -cP "\(this\.|\s\){1}$VARIABLE_NAME" $FILE_PATH

Quando tiro $ VARIABLE_NAME do script e o substituo diretamente pelo que estou procurando, ele funciona como esperado, então é algo com a substituição.

Alguma idéia do que eu posso experimentar?

    
por Walter 03.05.2011 / 17:41

4 respostas

2

O problema parece residir no seu regex. você pode nos mostrar o que você está tentando combinar?

se você está tentando corresponder construções como esta:

this.contentOfVar
  contentOfVar

tente com o seguinte:

grep -cP "(this\.|\s)$VARIABLE_NAME" $FILE_PATH

Isso funciona no GNU grep. Você não precisa especificar {1} , já que o padrão será 1. Com o sinal -P ativado, \( e \) corresponderão a parênteses literais na string, pois esse é o comportamento perl.

    
por 03.05.2011 / 18:25
0

Parece que o problema está no regex que está escapando. Aqui está um exemplo completo de como eu faria algo assim.

#!/bin/bash

VARIABLE_NAMES=(testOne testTwo)
RE="(this\.|\s){1}"

cat > ./testfile.txt <<EOF
this.testOne
this.testTwo
this.testTwo
this.testOne
this.testTwo
EOF

for VARIABLE_NAME in ${VARIABLE_NAMES[@]}; do
    grep -cP "${RE}${VARIABLE_NAME}" testfile.txt
done

exit 0
    
por 03.05.2011 / 18:44
0

Para adicionar as respostas de outras pessoas, sugiro usar aspas simples, exceto quando você precisar explicitamente de algo de uma variável. Por exemplo:

#!/usr/bin/env bash

dosomething | grep -cP 'some stuff'${SOMEVARIABLE}'more stuff';

Se você precisar de aspas no regex, parece um pouco mais feio:

# ...
dosomething | grep -cP 'some stuff'"'"'this part has a single-quote around it'"'"${SOMEVARIABLE}'more stuff';

O benefício de usar aspas simples é que você não precisa escapar das coisas.

-Brian

    
por 03.05.2011 / 23:03
0

Tem a ver com escapar das aspas e das barras:

VARIABLE_NAME="_firstName"
FILE_PATH="/tmp/*"
echo grep -cP \"\\(this\\.\|\\s\\)${VARIABLE_NAME}\" $FILE_PATH
grep -cP \"\\(this\\.\|\\s\\)${VARIABLE_NAME}\" $FILE_PATH

Eu adicionei o eco como um exemplo para mostrar como ele é interpelado.

    
por 03.05.2011 / 22:58