Extrair triplos trechos de blocos delimitados por backtick '' 'trechos do arquivo de marcação

4

Eu tenho um arquivo markdown pandoc que tem muito código. Eu quero extrair todos os bits de código do arquivo, de preferência usando sed . A sintaxe do código em pandoc é de três ou mais sinais '' 'para iniciar e terminar o segmento de código.

'''
Code is here
'''

Eu posso extrair uma linha, mas não tenho como extrair entre marcadores .

    
por recluze 13.01.2013 / 15:05

4 respostas

7

sed -n '/^'''/,/^'''/ p' < input.file

Imprimirá todas as linhas entre '' ', mas incluindo as linhas' '' também. Para se livrar disso:

sed -n '/^'''/,/^'''/ p' < input.file | sed '/^'''/ d'

Você pode encontrar uma explicação de como usar intervalos de linha por padrão e os comandos 'p' e 'd' começando aqui:

link

    
por 13.01.2013 / 17:08
2

Você também pode usar perl :

perl -0777e '$_=<>;print $1 while /^'{3,}\s*\n(.*?)^'{3,}\s*\n/msg' your_file

Explicação

  • A parte 0777 define o separador de registro de entrada ( $/ ) para fazer o slurp do arquivo inteiro
  • O regex procura por uma linha que comece com 3 ou mais backticks, em seguida, combina e captura o menor número possível de linhas (garantido pelo quantificador lento *? ) seguido por uma linha começando com 3 ou mais ticks.
  • O modificador regex m garante que ^ corresponderia ao início das linhas e não apenas ao início do arquivo. O modificador s certifica-se de que . corresponderá a um caractere de nova linha para que .*? possa corresponder a várias linhas. Finalmente g certifica-se de que o regex será aplicado iterativamente ao conteúdo do arquivo para que todas as correspondências sejam encontradas.
por 27.07.2013 / 16:46
2

NOTA: eu sou o desenvolvedor principal & mantenedor do rundoc.

Para quem procura uma ferramenta de uso geral para esse tipo de coisa:

Rundoc é uma ferramenta de uso geral para executar ou extrair blocos de código protegidos de arquivos de remarcação. Você pode instalá-lo através do pip para python3: pip3 install rundoc .

Para extrair blocos de código:

rundoc list-blocks your_file.md -t#bash#perl#python

extrairá blocos de código com a tag bash , perl ou python highlighting. Infelizmente os blocos de códigos sem marcas de destaque são sempre ignorados.

Você também pode executar o arquivo de marcação como um script com

rundoc run your_file.md -t#bash#perl#python

Isso executará todos os blocos de código com a tag de realce correspondente e usará a tag de realce para encontrar o intérprete adequado.

NOTA: Para obter código puro sem JSON ou cabeçalhos, use jq tool:

rundoc list-blocks your_file.md | jq -r "(.code_blocks[] | {code}).code"
    
por 13.08.2018 / 20:50
0

Você pode usar o próprio pandoc para extrair o código de todos os blocos de código. (Estas instruções são para a versão pandoc > = 2.0. Nenhum outro software é necessário; o pandoc inclui um intérprete lua.).

Crie um arquivo extractcode.lua com o conteúdo:

function CodeBlock(el)
    print(el.text)
end

Agora execute pandoc da seguinte forma, em que myfile.md é seu arquivo de remarcação:

pandoc --lua-filter extractcode.lua myfile.md -o /dev/null

Isto irá imprimir o conteúdo de todos os blocos de código. Observe que isso incluirá todos os blocos de código em myfile.md , incluindo blocos de código recuados. Ao contrário das soluções sed propostas nas outras respostas, também incluirá blocos de código que ocorrem em contextos recuados, como itens de lista ou blockquotes:

1.  '''lua
    a = 5
    ''''

> '''
> my code
> '''

E ele não ficará confuso com coisas como essa, em que os backticks fazem parte do bloco de códigos e não de delimitadores:

''''
'''
code example with three backticks as part of the code block
'''
''''
    
por 16.08.2018 / 09:25

Tags