Melhor com sed
:
sed -n 's/^\[one]: //p' < example.txt
Com o GNU grep
com suporte para PCRE recente, você também pode fazer:
grep -Po '^\[one]: \K.*' < example.txt
Ou
grep -xPo '\[one]: \K.*' < example.txt
Em qualquer caso, note que na maioria dos shells, [...]
são operadores glob. Em grep [myword]
, [myword]
é expandido para a lista de arquivos que correspondem a isso, ou seja, qualquer arquivo no diretório atual cujo nome seja m
, y
, w
, o
, r
ou d
(e se não houver nenhum, dependendo do shell, o padrão é passado como é para grep
ou você recebe um erro). Então eles devem ser citados para o shell (com aspas simples, por exemplo, como nas soluções aqui). Por exemplo, se houver um arquivo chamado r
no diretório atual e um chamado d
, grep [myword]
se tornará grep d r
em todos os shells, mas fish
.
[...]
é também um operador especial em expressões regulares (muito semelhante ao operador [...]
glob), grep '[myword]'
corresponderia às linhas que contêm m
, y
, w
, o
, r
ou d
. Então você precisa escapar também da abertura [
para grep
(para expressões regulares). Isso pode ser feito com grep '\[myword]'
ou grep '[[]myword]'
.
^
é outro operador de expressão regular que significa: corresponde apenas no início da linha. Portanto, grep '^\[myword]: '
corresponde a linhas que começam com [myword]:
.
Enquanto grep
serve apenas para imprimir linhas de correspondência (não é um editor de fluxo como sed
), o GNU grep
adicionou a opção não padrão -o
para imprimir a porção correspondente (s ) da linha (se não estiver vazia). Ele também adicionou as opções -P
para usar expressões regulares compatíveis com perl (em PCRE) em vez de básicas sem -P
.
Em PCREs recentes, \K
é um operador que redefine o início da parte correspondente. Portanto, em grep -Po '^\[one]: \K.*'
, imprimimos a parte correspondente por causa de -o
, mas devido a \K
, essa parte correspondente torna-se a seqüência de caracteres ( .*
) encontrada depois de [one]:
.