Это звучит мне, что Вы обращаетесь к zsh-history-substring-search плагину. В этом случае первая вещь я заметил в Вашем .zshrc
это, Вы не включаете тот плагин в свой список.
Измените эту строку:
plugins=(git rvm rails3 bundler gem)
Кому:
plugins=(git rvm rails3 bundler gem history-substring-search)
Всякий раз, когда у меня есть такой проект, мне нравится подходить к нему поэтапно. Первое, что я хотел бы сделать, это добавить эхо
внутрь цикла, а затем запустить его, чтобы убедиться, что цикл дает мне то, что я хочу.
#! /bin/bash
for (( CON1=10000; CON1<=99999; CON1++ )) ;
do
echo $CON1
done
Теперь, когда я запускаю его, я буду использовать head -5
, чтобы просто показать первые строки 5, которые он выводит.
$ ./cmd.bash | head -5
10000
10001
10002
10003
10004
Хорошо, так что выглядит хорошо, проверьте конец так:
$ ./cmd.bash | tail -5
99995
99996
99997
99998
99999
Это выглядит хорошо тоже. Теперь давайте выясним, пути мы могли бы подойти к следующему этапу идентификации чисел с 2 цифрами из набора {4,5,6}. Мой первый инстинкт здесь, чтобы пойти на grep
. Есть также методы для этого чисто в Баше, но я люблю использовать различные инструменты, grep
, awk
и sed
для выполнения таких вещей, главным образом потому, что так работает мой разум.
Так как мы можем grep
строки, которые содержат 2 цифры из аппарата, {4,5,6}? Для этого можно использовать нотацию набора, которая написана так в regex, [456]
. Можно также указать, сколько цифр должно совпадать с этим набором. Это написано так:
[456]{#}
Где #
- число или диапазон чисел. Если бы мы хотели 3, мы бы написали [456] {3}
. Если бы мы хотели 2-5 цифры, мы бы записали [456] {2,5}
. Если требуется 3 или более, [456] {3,} '.
Таким образом, для вашего сценария это [456] {2}
. Для использования регекса в grep
необходимо, чтобы определенная версия grep
поддерживала коммутатор -E
. Обычно это доступно в большинстве стандартных grep
.
$ echo "45123" | grep -E "[456]{2}"
45123
Кажется, что это работает, но если мы дадим ему числа с 3, мы начинаем видеть проблему:
$ echo "45423" | grep -E "[456]{2}"
45423
Это тоже совпадение. Это происходит потому, что grep
не имеет понятия, что это цифры в последовательность. Это глупо. Мы сказали, чтобы он сказал нам, если серия символов в нашем ряде из набора и что есть 2 из них и есть 2 цифры в последовательность 45423
.
Это также не удается для этих последовательностей:
$ echo "41412" | grep -E "[456]{2}"
$
Так этот метод пригоден? Это если мы немного изменим тактику, но нам придется возродить регекс.
$ echo -e "41123\n44123\n44423\n41423" | grep -E "[^456]*([456][^456]*){2}"
44123
44423
41423
Выше представлены 4 типа последовательностей. echo-e «41123\n44123\n4423\n41423»
просто печатает 4 числа из нашего диапазона.
$ echo -e "41123\n44123\n44423\n41423"
41123
44123
44423
41423
Как работает этот регекс? Он устанавливает образец regex, равное нулю или большему числу символов «not [456]», а затем 1 или большему числу символов [456] или нулю или большему количеству символов «not [456]», и ищет 2 вхождения последнего.
Теперь мы делаем небольшую сборку в вашем сценарии.
for (( CON1=10000; CON1<=99999; CON1++ )) ;
do
if echo $CON1 | grep -q -E "[^456]*([456][^456]*){2}"; then
echo $CON1
fi
done
Используя нашу головную
и хвостовую
хитрость сверху, мы видим, что она работает:
$ ./cmd.bash | head -5
10044
10045
10046
10054
10055
$ ./cmd.bash | tail -5
99955
99956
99964
99965
99966
Но этот метод оказывается собачьим медленным. Проблема в том, что grep
. Это дорого, и мы выполняем "grep 1 времени, за итерацию через цикл, так что это ~ 80 тысяч раз!
Чтобы улучшить то, что мы можем переместить нашу команду grep
за пределы цикла и запустить ее 1 время,после того, как список был создан, как это, используя нашу первоначальную версию сценария, который только что повторил числа:
$ ./cmd.bash | grep -E "[^456]*([456][^456]*){2}"
ПРИМЕЧАНИЕ: Мы могли бы удалить цикл for полностью и использовать инструмент командной строки, seq
. При этом генерируется одна и та же последовательность чисел, seq 10000 99999
.
Модным способом для этого было бы использовать последовательность чисел из вышеуказанной команды, а затем направить ее в команду paste
, которая вставляет +
между каждым числом, а затем запустить этот вывод в калькулятор командной строки, bc
.
$ ./cmd.bash | grep -E "[^456]*([456][^456]*){2}" | paste -s -d"+"
10044+10045+10046+10054+10055+10056+10064+10065+10066+10144+10145+...
$ ./cmd.bash | grep -E "[^456]*([456][^456]*){2}" | paste -s -d"+" | bc
2409327540
Но это совершенно другой способ решения этой проблемы, так что давайте вернемся к для
цикла.
Поэтому нам нужен какой-то метод тестирования, если цифра имеет точно 2 цифры в Bash, но не так дорого, как вызов grep
80k раз. Современные версии Bash включают в себя возможность совпадения с помощью оператора = ~
, который может делать совпадение аналогично grep
. Давайте посмотрим на это дальше.
#!/bin/bash
for (( CON1=10000; CON1<=99999; CON1++ )) ;
if [[ $CON1 =~ [^456]*([456][^456]*){2} ]]; then
echo $CON1
fi
done
Выполнение этого действия делает именно то, что мы хотим.
$ ./cmd1.bash | head -5
10044
10045
10046
10054
10055
$ ./cmd1.bash | tail -5
99955
99956
99964
99965
99966
Проверка показывает, что он работает с 41511 сейчас:
$ ./cmd1.bash | grep 41511
41511
Я полагаю, что вы должны сделать это в чистом сценарии Bash, но перевод алгоритма John1024 в awk дает значительное ускорение:
awk 'BEGIN{k=0;for(i=10000;i<100000;i++){j=i;if(gsub(/[456]/,"",j)==2)k+=i};print k}'
Это выполняется в менее чем 1/20 из Это также немного быстрее, чем версия Python, которая использует встроенный метод Python str.count ()
.
Я обычно перечисляю содержимое RPM и фильтрую его с помощью /bin/
. Файлы в этом каталоге являются исполняемыми.
$ rpm -ql ImageMagick | grep /bin/
/usr/bin/animate
/usr/bin/compare
/usr/bin/composite
/usr/bin/conjure
/usr/bin/convert
/usr/bin/display
/usr/bin/identify
/usr/bin/import
/usr/bin/mogrify
/usr/bin/montage
/usr/bin/stream
То же самое для Debian; Для установленного пакета
dpkg -L <packagename> | grep -F /bin/
DPKG -L
перечисляет содержимое пакета (в основном печатаю / var / lib / dpkg / info /
) и grep
Выбирает любые файловые пути, содержащие / bin /
.
для файла
файл, который вы еще не установили,
dpkg-deb -c path/to/filename.deb | grep -F /bin/
для незнакомого пакета, вы обычно также хотите изучить / usr / share / doc /
и если каталог содержит другие полезные вещи, такие как News News
или примеры
или , добавляют
подкаталог, посмотрите на тех.
с:
rpm -qlp package.rpm
Команда вы можете перечислить файлы внутри файла RPM. Выполненные файлы, вероятно, будут в папке Bin. Итак:
rpm -qlp package.rpm | grep bin
может работать тоже.
Как уже указывалось несколько других, ищите «/ bin» в списке файлов пакетов.
Вот Gentoo
$ Equery F Firefox | Greep Bin
Equery
является частью пакета Gentoollkit
.