В Bash встроена Substring

for file in xyz*
do
 ./transeq "$file" "${file}.faa" -table 11
done

Это простой цикл for, который перебирает каждый файл, начинающийся с xyzв текущем каталоге, и вызывает программу ./transeqс именем файла в качестве первого аргумента, за именем файла следует ".faa" в качестве второго аргумента, за которым следует "-таблица 11".

1
24.08.2019, 23:55
3 ответа

Попробуйте это:

echo "'${TEXT// [^0-9]*/}'" "'${TEXT1// [^0-9]*/}'"

Выход:

'Anything 7' 'Random 19'

Обратите внимание: если в строке нет чисел, этот код удалит все, что находится после первого пробела.

1
27.01.2020, 23:30

Вы можете использовать функцию сопоставления регулярных выражений оболочки bash:

$ TEXT='Random text 1 and some more random'

$ [[ $TEXT =~ ^[^0-9]*[0-9] ]] && printf '%s\n' "$BASH_REMATCH"
Random text 1

где ^[^0-9]*[0-9]соответствует нулю или более не -цифрам, за которыми следует цифра, привязанная к началу строки

0
27.01.2020, 23:30

Если есть только одна группа цифр, вы можете сделать это в два шага (в одном раскрытии):

  • Удалите самый длинный начальный текст, который заканчивается цифрой.

    $ text='Random 923 and more'
    $ echo "'${text##*[0-9]}'"
    ' and more'
    
  • Затем удалите выбранный завершающий текст из исходной строки:

    $ echo "'${text%"${text##*[0-9]}"}'"
    'Random 9'
    

Это работает, если в конце текста нет дополнительных цифр.

Если кластеров цифр может быть несколько, а вам нужен только первый, он становится немного длиннее и требует двух дополнительных переменных.

$ text='Random 945 and more 752 numbers'
$ lead=${text%%[0-9]*}
$ trail=${text#"$lead"}
$ echo "'$lead${trail%%[!0-9]*}'"
'Random 945'
1
27.01.2020, 23:30

Теги

Похожие вопросы