grepping uma variável e adicionando 1 a ela

2

Eu tenho uma variável contendo um número zeros à esquerda, e eu quero grep esta variável e essa mesma variável mais um. Eu fiz várias tentativas, mas me deparei com erros. Aqui está o que eu quero fazer:

read var
newvar=$(($var +1))
grep '$var' /some/dir
grep '$newvar' /some/dir

Eu realmente acho que há algo errado com o meu código. Eu também tentei alguns testes assim:

#!/bin/bash
echo "enter number"
read number
newnumber=$(($number + 1))
echo "$newnumber"

Isso me dá um erro: value too great for base (error token is . Se eu fizer assim:

 #!/bin/bash
echo "enter number"
read number
number=""
newnumber=$(($number + 1))
echo "$newnumber"

Isso produzirá 1 o tempo todo.

O que há de errado com minhas tentativas e como posso fazer o que eu quero?

    
por afbr1201 05.07.2011 / 19:17

3 respostas

3

Você está usando aspas erradas: aspas simples '' impedem a expansão de $ expressões ( $var e $(command) e o legado 'command' form). Use aspas duplas "" . Embora nesse caso, se você tiver certeza de que é um número, não precisará de nenhuma nenhuma cotação.

Para sua segunda pergunta ... você está usando zeros à esquerda? Isso indica octal, portanto, os dígitos 8 e 9 não funcionarão.

    
por 05.07.2011 / 19:21
2

geekosaur já explicou por que sua primeira tentativa falhou. Aqui estão algumas dicas adicionais sobre o que você está tentando fazer.

Se você estiver procurando por um número como 42 , provavelmente desejará corresponder 042 , mas não 1042 ou 421 . Tudo que você precisa para conseguir isso é uma expressão regular mais chique. Assumindo que $newnumber contenha o número (inteiro, positivo, em notação decimal) sem zero à esquerda, procure por $newnumber precedido pelo início da linha ou por um caractere não dígito, e da mesma forma depois. 0* permite mais zeros à esquerda. A opção -E diz a grep que você está usando a sintaxe de expressão regular moderna (em oposição à sintaxe histórica, que é mais ousada e menos poderosa).

grep -E "(^|[^0-9])0*$newnumber(\$|^[0-9])" /path/to/file

Para analisar um número com potenciais zeros à esquerda, no bash, você pode usar $((10#$newnumber)) para forçar uma interpretação decimal. Em outras conchas, é um pouco mais complicado; há uma construção de shell para obter o valor de uma variável sem um prefixo específico ${var#prefix} e uma construção semelhante para sufixos ${var%suffix} , mas não é possível especificar "a sequência mais longa possível de 0 caracteres" como um prefixo para faixa. Mas isso pode ser feito em duas etapas: primeiro obtenha a parte de var que não é o zeros à esquerda e use isso como um prefixo para remover. A parte de var que não é o zeros à esquerda é seu sufixo mais longo que começa com um diferente de zero, que é ${var%%[!0]*} (o duplo % significa retirar o sufixo mais longo que corresponde ao padrão; % eliminaria o sufixo mais curto).

read number
number=${number#${number%%[!0]*}}

Outra observação: grep REGEXP /some/file pesquisa o arquivo /some/file . Se você quiser pesquisar todos os arquivos em um diretório, deixe o shell gerar a lista de arquivos: grep REGEXP /some/dir/* . Se você quiser pesquisar todos os arquivos em um diretório e seus subdiretórios recursivamente, passe a opção -r para grep para torná-la recursiva: grep -r REGEXP /some/dir .

    
por 05.07.2011 / 22:52
0

Como geekosaur disse, você está usando aspas erradas. Fique com doublequotes quando quiser que o shell expanda uma referência de variável para um valor.

Em segundo lugar, você está fazendo a matemática dentro dos parênteses duplos errado. Você NÃO quer um $ dentro, referências de variáveis dentro da construção $ (()) não precisam de $.

#!/bin/bash
echo "enter number"
read number
newnumber=${number#${number%%[!0]*}}
newnumber=$((newnumber + 1))
echo "$number changes to $newnumber"

Essas duas mudanças funcionam para mim no seu original também ...

read var
newvar=${var#${var%%[!0]*}}
newvar=$((newvar + 1))
printf -v newvar "%02d" "$newvar"
grep "$newvar" /some/dir

UPDATE adicionou a linha printf para formatar a saída. UPDATE 2 adicionado na correção para inserir números preenchidos com zero. Este deve ser um exemplo completo agora.

    
por 05.07.2011 / 19:44