Возможно, с использованием последовательностей пробелов и символов без пробелов?
$ grep -Eo 'Exchange([[:space:]]+[^[:space:]]+){4}' << EOF
Meta Stack Exchange is where users like you discuss bugs, features, and
support issues that affect the software powering all 167 Stack Exchange
communities.
EOF
Exchange is where users like
или (стиль Perl, если ваш grep его поддерживает)
$ grep -Eo 'Exchange(\s+\S+){4}' << EOF
Meta Stack Exchange is where users like you discuss bugs, features, and
support issues that affect the software powering all 167 Stack Exchange
communities.
EOF
Exchange is where users like
Обратите внимание, что grep
не совпадает между строками — для многострочных совпадений вы можете вместо этого использовать pcregrep
.
Давайте воспользуемся циклом for для генерации целых чисел от 1 до 24, воспользуемся cd
в подоболочке для перехода в подкаталоги из каталога и выполним сценарий:
for (( i = 1; i <= 24; ++i )); do
( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done
Используя подоболочку, вы избегайте «возврата» к старому каталогу перед использованием cd
для следующего подкаталога. С помощью &&
вы также избегаете попыток запустить программу, если каталог по какой-либо причине не существует.
Очевидно, вы также можете использовать
for i in {1..24}; do
( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done
... но мне не нравится синтаксис {start..end}
по эстетическим соображениям, и он также не дает вам возможности будьте более гибкими в выборе способа выполнения цикла (в других ситуациях).
В чем проблема:
for ((i=1;i<=24;i++)) ; do
cd PKA${i}/timestep_size/v_0.001/250eV
../ovitos silica_defects.py
cd $OLDPWD
done
Это задача для расширения скобок bash
, {START..END}
:
PKA{1..24}
Вы можете сделать:
for f in PKA{1..24}/timestep_size/v_0.001/250eV/; do ...; done
И для silica_defects .py
, используйте абсолютный путь к файлу.