Как проанализировать определенный идентификатор из файла FASTA

Это не регулярное выражение в обычном синтаксисе регулярных выражений. Это подстановочный шаблон. Шаблоны подстановочных знаков Sh менее выразительны, чем регулярные выражения. Ksh, bash и zsh имеют шаблоны подстановочных знаков, которые столь же выразительны, как и регулярные выражения, но с другим синтаксисом. См. также Почему мое регулярное выражение работает в X, но не в Y?

Обычный способ сделать это в zsh — включить параметрextended_glob(, что почти все делают постоянно )и использовать подстановочный знак#, который соответствует любому номер предшествующего (типа *в обычном синтаксисе регулярных выражений ).

setopt extended_glob
no_spaces_before_bang=${original_string// #!/!}

Ваша попытка не удалась по двум причинам. Во-первых, *в шаблонах подстановочных знаков означает «любую последовательность символов». Во-вторых, не-жадное сопоставление нарушило бы цель, :оно привело бы к отсутствию сопоставления пробелов.

В ksh, а также в bash после shopt -s extglobи в zsh после setopt ksh_globвы можете использовать *( )для соответствия нулю или более пробелам или +( )для сопоставления одного или нескольких пробелов. Любой подойдет здесь.

Для обычного использования достаточно включить extended_glob. Для кодового гольфа это довольно высокая цена. Может быть, вы могли бы сократить пространство -удар к удару в петле:repeat $#a a=${a/ !/!}. Или вы можете войти в категорию «zsh с включенным extended_glob», что является языком, на котором написаны функции завершения zsh.

-3
30.11.2021, 23:12
1 ответ

Вы можете попробовать что-то вродеawk:

awk -F'[ _.]' '{if ($0~"^>") print ">"$3"_"$4; else print $0}' input_file

Вы можете использовать более короткую форму, как было предложено в предыдущем комментарии Эда Мортона:

awk -F'[ _.]' '{print (/^>/ ? ">"$3"_"$4 : $0)}' input_file
0
01.12.2021, 07:45

Теги

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