grep 201806{19..21} test
расширяется оболочкой до:
grep 20180619 20180620 20180621 test
Что grep
понимает как поиск 20180619
внутри 3 файлов, 20180620
, 20180621
и test
.
Если изменить на:
grep -e201806{19..21} test
Затем это расширяется до:
grep -e20180619 -e20180620 -e20180621 test
Что дает 3 e
выражения для grep
для поиска в test
.
Или вы можете:
printf '%s\n' 201806{19..21} | grep -f - test
Когда мы передаем выражения в виде количества строк ввода вgrep
(с некоторыми реализациями, вам может понадобиться /dev/stdin
вместо-
).
В частности, zsh
вы также можете сделать это:
numbers=({19..21} 25 31)
grep -E "201801(${(j:|:)numbers})" test
Где мы используем флаг расширения параметра (j:|:)
для соединения элементов массива с|
(расширенным оператором чередования регулярных выражений ), чтобы его можно было использовать в качестве ERE.
Или вы можете связать этот массив со скаляром регулярного выражения с помощью:
$ typeset -T re numbers '|'
$ numbers=({19..21} 25 31)
$ echo $re
19|20|21|25|31
В то время как регулярные выражения обычно не имеют возможности сопоставления диапазонов чисел, zsh
шаблоны (, которые с extendedglob
функционально эквивалентны регулярным выражениям )работают с оператором <x-y>
(только для последовательностей десятичных цифр):
print -rl -- ${(M)${(f)"$(<test)"}:#*201806<19-21>*}
Это было довольно легко исправить. Спасибо пользователю muru за помощь. Я заставил сценарий сказать это:
#!/bin/sh
sudo /opt/thinkorswim/thinkorswim
Затем добавил это к/etc/sudoers
:
username ALL=(ALL) NOPASSWD: /opt/thinkorswim/thinkorswim
sudo
работал на sh
, а не на самом файле. Теперь все работает отлично, это экономит мне много времени каждый день. Еще раз спасибо муру .