как к grep переменная в программной оболочке? [дубликат]

Путь реестра для Visual Studio 2008 является тем же, но с 9,0 как номер версии:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Text Editor
5
задан Craig Trader 30 November 2009 в 06:24
поделиться

5 ответов

As others have stated, the problem is that the single quotes prevent expansion of the variable. However, using $() allows you to use double quotes:

echo " Number is: $(grep "Multiple_Frame = echo **$var**"  20mrf.txt | wc -l)" >>statisic.txt

although I suspect something like this is what you meant:

echo " Number is: $(grep "Multiple_Frame = $var"  20mrf.txt | wc -l)" >>statisic.txt

You should also be aware that grep has an option to output the count so you can omit wc:

echo " Number is: $(grep -c "Multiple_Frame = $var"  20mrf.txt)" >>statisic.txt
4
ответ дан 14 December 2019 в 04:40
поделиться

@OP, делать то, что вы делаете таким образом, довольно неэффективно. Вы вызываете grep и wc 20 раз для одного и того же файла. Откройте файл только один раз и получите все, что хотите, за 1 итерацию содержимого файла. Пример в bash 4.0

declare -A arr
while read -r line
do  
    case "$line" in
        *"Multiple_Frame ="*) 
            line=${line#*Multiple_Frame = }
            num=${line%% *}
            if [ -z ${number_num[$num]} ] ;then
               number_num[$num]=1
            else
                number_num[$num]=$(( number_num[$num]+1 ))
            fi
            ;;
    esac    
done <"file"
for i in "${!number_num[@]}"
do
    echo "Multiple_Frame = $i has ${number_num[$i]} counts"
done

аналогично, вы можете использовать ассоциативные массивы в gawk, чтобы помочь вам в решении этой задачи.

gawk '/Multiple_Frame =/{
  sub(/.*Multiple_Frame = /,"")
  sub(/ .*/,"")
  arr["Multiple_Frame = "$0]=arr["Multiple_Frame = "$0]+1  
}END{
    for(i in arr) print i,arr[i]
}' file
2
ответ дан 14 December 2019 в 04:40
поделиться

Каждую замену нужно сохранять в переменной. Примерно так:

#!/bin/bash

for ((var=0; var < 20; var++))
do

count=`grep "Multiple_Frame = $var"  20mrf.txt | wc -l`
echo " Number is: $count" >> statisic.txt 

done
1
ответ дан 14 December 2019 в 04:40
поделиться

Хорошо, вторая [sic] проблема связана с цитированием в строке 5. Ссылка на $ var никогда не будет расширена, потому что она заключена в одинарные кавычки. Вы можете исправить это, заменив одинарные кавычки ( '

Первая [sic] проблема заключается в том, что вы пытаетесь сделать слишком много в одной строке, что вызывает проблему с вложением кавычек. Разбейте строку на несколько команд, сохраняя промежуточные результаты по мере необходимости. Да, он может работать немного медленнее, но вы сэкономите МНОГО времени на его отладку и поддержку.

Второй закон трейдера: если вам нужно выбирать между оптимизацией для повышения производительности и оптимизацией для удобства обслуживания, ВСЕГДА выбирайте код более удобен в обслуживании. Компьютеры все время становятся быстрее; Программисты этого не делают.

1
ответ дан 14 December 2019 в 04:40
поделиться

Строка внутри $ (...) заключена в одинарные кавычки ( '...' ). Эти кавычки предотвращают расширение переменной. Вместо этого используйте двойные кавычки. В вашем случае:

#!/bin/bash

for ((var=0; var<20; var++))
do
echo " Number is: $(grep 'Multiple_Frame = echo **'"$var"'**'  20mrf.txt | wc -l)" >>statisic.txt 

done

Обратите внимание, что в этом примере кажется, что двойные кавычки для команды echo уже открыты, но вы должны отметить, что $ (...) вычисляется первым, и внутри него нет двойных кавычек. Таким образом, изменение здесь состоит в том, чтобы закрыть одинарную кавычку grep вместо открытой двойной кавычки, а затем закрыть двойные кавычки и снова открыть одинарную кавычку.

Это длинное объяснение иллюстрирует преимущества разделения выражения на части, как предполагают другие ответы.

0
ответ дан 14 December 2019 в 04:40
поделиться