O problema é que depois de encontrar :first-var ||
, não há || :second-var
restante no texto restante. grep -o
só pode imprimir partes das linhas que não se sobrepõem.
Você poderia fazer:
$ perl -lne 'print for /:\S+\s+\|\|/g, /\|\|\s+:\S+/g' file
:first-var ||
|| :second-var
(com todo o :var ||
s impresso antes do || :var
s).
Ou se você quiser apenas a parte :var
, com o GNU grep
com suporte a PCRE:
$ grep -Po ':\S+(?=\s+\|\|)|\|\|\s+\K:\S+' file
:first-var
:second-var
O mesmo que:
perl -lne 'print for /:\S+(?=\s+\|\|)|\|\|\s+\K:\S+/g'
Agora, se o que você deseja é extrair o :foo
e o :bar
em uma linha que sempre tem o formato anything :foo || :bar
, você pode fazer isso de maneira padrão com:
s='[[:space:]]\{1,\}' S='[^[:space:]]\{1,\}'
sed -n "/\(:$S\}\)$s\{1,\}||$s\(:$S\).*/{
s//\
\
/
s/.*\n\(.*\n\)//p
}'