Como combinar tudo desde o último delimitador YAML em diante

3

Eu normalmente uso grep para procurar um padrão em uma string. No entanto, neste caso particular, eu tenho que identificar um cabeçalho YAML, também, ele termina com um traço triplo.

Meu arquivo test.info tem o seguinte conteúdo

---
title: dont't know
draft: true
---
this is a test to add some extra content

Eu quero a seguinte saída, ou seja, tudo de após o último delimitador YAML até o final do arquivo:

this is a test to add some extra content

Quando eu insiro os traços, o bash retorna o seguinte erro:

$ cat test.info | grep '---' -A1
grep: unrecognized option '---'

Eu tentei "escapar" dos traços sem sucesso. Qualquer ideia? Isso é para o BSD grep. As coisas que me confundem é que eu posso conseguir o que quero, se eu fizer algo como o seguinte.

$ cat test.info | grep 'this' -A1

O problema é que eu não sei qual é a primeira palavra.

Eu posso usar o arquivo como recomendado, mas a ferramenta retorna o padrão e não tudo imediatamente depois:

$ grep -m 1 -e '---' test.info 
---
$ grep -- --- test.info | tail -1
---
    
por Andrea Moro 19.11.2014 / 21:25

6 respostas

0

Então, sem receber nenhum crédito como eu não quero, acabei de postar a solução que funcionou no meu mac graças ao KasiyA

tail -r file| awk '/---/ {exit} {print}'| tail -r
    
por 25.11.2014 / 18:58
2

Que tal este comando?

tac file| awk '/---/ {exit} {print}'|tac

No OSX, basta substituir os comandos tac por tail -r

Do man tac:

 tac - concatenate and print files in reverse - reverse of cat command ;)

Saída de tac file :

next line
this is a test to add some extra content
---
draft: true
title: dont't know
---

O comando awk awk '/---/ {exit} {print}' imprime todas as linhas até encontrar o primeiro padrão encontrado.

Saída:

next line
this is a test to add some extra content

execute novamente o comando tac para reverter para o padrão.

Saída:

this is a test to add some extra content
next line
    
por 22.11.2014 / 15:02
1
$ line=$(grep -n -- --- test.info | tail -n 1 | cut -d: -f1);tail -n +$(( $line + 1 )) test.info 
this is a test to add some extra content

É necessário adicionar uma verificação de erro adequada, como em if $line 'not numeric' ...

O problema original vem do fato de que você precisa escapar do - ou dizer ao programa que não é uma opção:

$ grep -n -- --- test.info
1:---
4:---

A maioria dos softwares (?) gnu tem "-" como uma opção; dizendo para parar a análise para mais opções depois desse ponto.

Nota:
$ grep --version
deve dizer se é um utilitário GNU grep ou não.

$ grep -h
ou $ grep --help
geralmente informa as opções que entende.

    
por 19.11.2014 / 22:40
1

Usando o awk:

awk 'END{print}' RS='---' file

RS define --- como separador de registro e com END{print} somente imprimimos o último registro.

Usando sed:

sed -r ':a;$!{N;ba};s:^(.*\n?)---::' file
    
por 11.12.2014 / 20:56
0

Eu vejo pelo menos duas maneiras diferentes de fazer isso. Na verdade você precisa escapar do primeiro "-"

Usando a opção -e:

grep -e "---" test.info

Escapando o primeiro "-" com barra invertida:

grep "\---" test.info
    
por 19.11.2014 / 21:39
-1

Aborde um aspecto da sua pergunta (agora original).

(E suas novas perguntas ainda falam sobre grep e -A1 e fingem que você não consegue encontrar uma maneira de especificar 3 hipnens e isso é errado porque nos seus comentários você mostrou que pode).

[sua pergunta original perguntou como mostrar resultados FROM um ponto. quando na verdade você quer FROM AFTER. Sua nova pergunta ainda afirmou 'de' atualizei para 'depois' '

Se parece com grep e -A1 não é o que você quer, mas ainda é mencionado mesmo em sua pergunta atualizada

Não vejo resultados engraçados. Talvez você possa colar os resultados que acha engraçados. [você tem agora]

Se você fizer o grep pattern -A1, então ele copia o padrão seguido pela próxima linha. E despeja -- após cada partida.

por exemplo,

$ cat t3.info
,,,
qwerty
uiop
,,,




werwer
werwer
,,,,,
werwerwer
werwerwer
werwerwer
,,,,



$ cat t3.info | grep -P ',,,' -A1
,,,
qwerty
--
,,,

--
,,,,,
werwerwer
--
,,,,



$

Você poderia fazer grep -P '(? = ---) ...' -A1 Outra coisa que você pode tentar é este grep -P '\ x2d {3}' -A1

E se o seu arquivo tiver ---

$ cat t3.info
---
qwerty
uiop
---




werwer
werwer
---
werwerwer
werwerwer
werwerwer
---

Claro que isso não funciona

$ cat t3.info | grep -P '---' -A1 grep: opção não reconhecida '---' Uso: grep [OPTION] ... PATTERN [FILE] ... Tente "grep --help" para mais informações.

Mas isso funciona

$ cat t3.info | grep -P '\---' -A1
---
qwerty
--
---

--
---
werwerwer
--
---

e isso funciona

$ cat t3.info | grep -P '(?=\x2d{3})...' -A1
---
qwerty
--
---

--
---
werwerwer
--
---

versão grep 2.16

$ grep --version
grep (GNU grep) 2.16

Se você não quiser incluir seu padrão, então, qualquer opção que você use, não será -A1 e não vejo por que você está tendo problemas com a correspondência ---

Pode ser que, para fazer o que você quer com o grep ou algo parecido com o grep, você precisa corresponder à nova linha, por exemplo, por exemplo. regex de lookbehind positivo .. para --- \ n mas aparentemente grep não pode combinar novas linhas, caso em que você pode ter mais sorte com pcregrep link ou de alguma outra forma. Sua pergunta é mais, como você pode combinar o que segue na linha depois de um padrão.

    
por 19.11.2014 / 23:38

Tags