awk
использует пробел в качестве разделителя.
Попробуйте это:
$ awk '{print $1, $4, $5, $7, substr($16, 2, 7) }' file
chr1 11869 12227 + DDX11L1
chr1 12010 12057 + DDX11L1
Это не регулярное выражение в обычном синтаксисе регулярных выражений. Это подстановочный шаблон. Шаблоны подстановочных знаков 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.