Usando uma variável em um regex

3

Como posso usar uma string variável em expressões regulares

 while read line
    do
        if [[ line =~ *"$key"* ]]; then
            echo line
        fi
    done < "$filename"

$key é uma variável de string e eu quero imprimir todas as linhas que tem o valor de $key

    
por user2798694 03.01.2014 / 19:10

2 respostas

7

Você cometeu alguns erros lá. Aqui está o seu script corrigido:

while read line
do
    if [[ "$line" =~ "$key" ]]; then
        echo $line
    fi
done < "$filename"

Embora pareça que poderia ser substituído por um simples grep :

grep "$key" "$filename"
    
por 03.01.2014 / 19:12
1

Primeiro, sempre que você estiver usando o valor de uma variável, precisará escrever $line .

Além disso, observe que read line retira os espaços em branco inicial e final e permite a sequência de linhas invertidas-nova como uma continuação de linha. Para manter os espaços em branco, use IFS= read . Para evitar tratar \ especialmente, use read -r . Você pode combinar os dois como IFS= read -r .

O que você quer testar exatamente? Se você quiser testar se a linha é exatamente $key (exceto para espaço em branco, a menos que você use IFS= read ), use o operador == e coloque $key entre aspas duplas.

if [[ $line == "$key" ]]; then …

Se você quiser testar se a linha contém $key (por exemplo, se o valor de key for fu*bar , então hellofu*bar e fu*barqux corresponderão, mas fuubar e gu*bar don ' t), em seguida, use o operador == e, novamente, certifique-se de colocar $key entre aspas duplas. O lado direito do operador == é um padrão curinga da shell; colocar a variável entre aspas faz com que seja tratada literalmente.

if [[ $line == *"$key"* ]]; then …

Se você quiser tratar $key como um padrão de caractere curinga, se $key for fu*bar , a linha poderá ser fubar ou fuqwebar , mas não fbar ou afubar . fora das aspas duplas:

if [[ $line == $key ]]; then …

Se você quiser que apenas parte da linha corresponda, permitindo coisas como afubar :

if [[ $line == *$key* ]]; then …

Use o operador de correspondência de expressões regulares =~ se quiser ter uma expressão regular estendida à direita lado de mão. Uma expressão regular pode corresponder a parte da linha; Se você quiser corresponder a linha inteira, coloque ^ no início da regex e $ no final. Por exemplo, [[ $line == *"$key"* ]] é equivalente a [[ $line =~ "$key" ]] , enquanto [[ $line == "$key" ]] é equivalente a [[ $line =~ ^"$key"$ ]] .

    
por 03.01.2014 / 23:54