Проблема в том, что после нахождения :first-var ||
в оставшемся тексте не осталось || :second-var
. grep -o
может печатать только те части строк, которые не перекрываются.
Вы могли бы сделать:
$ perl -lne 'print for /:\S+\s+\|\|/g, /\|\|\s+:\S+/g' file
:first-var ||
|| :second-var
(со всеми :var ||
напечатанными перед || :var
с ).
Или, если вам нужна только часть :var
, с GNU grep
с поддержкой PCRE:
$ grep -Po ':\S+(?=\s+\|\|)|\|\|\s+\K:\S+' file
:first-var
:second-var
То же, что и:
perl -lne 'print for /:\S+(?=\s+\|\|)|\|\|\s+\K:\S+/g'
Теперь, если вы хотите извлечь :foo
и :bar
в строку, которая всегда имеет форму anything :foo || :bar
, вы можете сделать это стандартно с помощью:
s='[[:space:]]\{1,\}' S='[^[:space:]]\{1,\}'
sed -n "/\(:$S\}\)$s\{1,\}||$s\(:$S\).*/{
s//\
\1\
\2/
s/.*\n\(.*\n\)/\1/p
}'
setopt magic_equal_subst
Это работает как со старым -стилем, так и с новым -стилем, т. е. с завершением compinit
или без него.
Завершение имен файлов после =
является неясным и недокументированным побочным эффектом опции magic_equal_subst
. Задокументированный эффект этой опции заключается в том, чтобы включить расширение имени файла после =
.
В большинстве случаев, если вы вообще заметили эффект от этой опции, это желаемый эффект, т.е.
somecommand --option=~/file
передает путь в вашем домашнем каталоге к somecommand
, а не путь в каталоге с именем ~
. Однако это также имеет обычно нежелательный эффект, заключающийся в том, что аргумент ==
запускает расширение имени файла :
somecommand foo==bar
проходит foo=/bin/bar
, если команда bar
находится в $PATH
по адресу /bin/bar
. Если вы хотите буквально передать ==
команде, по крайней мере один из знаков равенства должен быть заключен в кавычки, например.
somecommand foo=\=bar
somecommand foo\==bar
В новой системе завершения в стиле -это обрабатывается внутри_default
. Если вы хотите получить завершение имени файла после =
без включения magic_equal_subst
, вам нужно переопределить или обернуть _default
, чтобы получить тот же эффект. Например:
autoload +X -U _default
functions[_default]="setopt local_options magic_equal_subst; $functions[_default]"