По умолчанию grep
использует Базовые регулярные выражения (BRE), которые не поддерживают {N}
. Если он работает в командной строке, то, скорее всего, grep
имеет псевдоним grep -E
или grep -P
. Вы можете проверить, выполнив
alias | grep grep
Псевдонимы не включены в сценарии. Как объясняется в man bash
:
Aliases are not expanded when the shell is not interactive, unless the
expand_aliases shell option is set using shopt.
Таким образом, в неинтерактивной оболочке, которую вы получаете при запуске скрипта, псевдонимы не будут работать. У вас есть два варианта: либо включить псевдонимы явно в вашем скрипте, а затем использовать источник ~/. bashrc
файл, чтобы получить определения псевдонимов (кстати, не нужно экранировать ,
):
#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
grep -o ',[a-z][a-z0-9]{1,7}' source.txt > test.txt
Или, что гораздо проще, использовать grep -E
в самом скрипте:
#!/bin/bash
grep -Eo ',[a-z][a-z0-9]{1,7}' source.txt > test.txt
Возможно, вы также захотите рассмотреть инструменты вроде awk
которые предназначены для работы с данными, разделенными полями. Есть шанс, что они значительно упростят вам жизнь.
$ awk '{ print $0, "("$2"-"$8") + ("$4"-"$10")"}' inputfile
X 2.63766751981802 Y 1.68326762144808 Z 0 XX 2.63577810877244 YY 1.67475013544567 ZZ 0 (2.63766751981802-2.63577810877244) + (1.68326762144808-1.67475013544567)