Сопоставление строкового шаблона Zsh для удаления пробелов

awkиспользует пробел в качестве разделителя.

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

$ awk '{print $1, $4, $5, $7, substr($16, 2, 7) }' file
chr1 11869 12227 + DDX11L1
chr1 12010 12057 + DDX11L1
0
13.09.2019, 20:14
1 ответ

Это не регулярное выражение в обычном синтаксисе регулярных выражений. Это подстановочный шаблон. Шаблоны подстановочных знаков 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.

2
28.01.2020, 02:29

Теги

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