O texto do Grep só é exibido após [word]:

0

Eu tenho um arquivo example.txt que contém o seguinte texto:

[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc

Eu preciso grep e mostrar apenas o texto que depois de [myword] : Tentei testá-lo desta maneira:

grep [myword] /tmp/example.txt | cut -d ':' -f 2

Em cada [myword] , ele imprime todos depois de colchetes, mas como posso obter apenas o que eu preciso apenas e não todos?

Eu preciso imprimir apenas o teste depois de alguns colchetes. Por exemplo, quero imprimir apenas o texto que na linha [one]: , mas não depois de [two]: ou [onemore]: lines, para que a saída seja bla bla bla onebla twobla . Se eu quiser imprimir tudo depois de [onemore]: - a saída correta deve ser i got mad and etc

    
por alya 18.08.2016 / 09:15

3 respostas

0

Se você deseja a solução que é independente em um delimitador, use awk

$ cat 304162 
[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc
[fourth:one]: some more bla, well ! worst case
$ awk '/\[onemore\]/{sub(/^[^]]*\]:[[:blank:]]*/,"");print}' 304162
i got mad and etc
$ awk '/\[fourth:one\]/{sub(/^[^]]*\]:[[:blank:]]*/,"");print}' 304162
some more bla, well ! worst case
    
por 18.08.2016 / 10:19
3

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]: .

    
por 18.08.2016 / 09:34
0

[one] expressão regular significa "um caractere correspondente a o ou n ou e .
grep [one] /tmp/example.txt corresponderá a todas as linhas do seu exemplo

Para corresponder os caracteres [] as que você precisa para escapar deles:

grep \[one\] /tmp/example.txt   | cut -d ':' -f 2

Ou você pode usar grep -F , que ignora a sintaxe da expressão regular:

grep -F [one] /tmp/example.txt | cut -d ':' -f 2
    
por 18.08.2016 / 14:37

Tags