Tenho um arquivo bem básico;
15
Chapter name
some text and some more text
some text and some more text
Eu estava tentando conseguir algo assim
Book: 15 Chapter name
some text and some more text
some text and some more text
Eu estava tentando fazer isso usando sed com este padrão;
sed 's/^\([[:digit:]]\+\)\n\([[:alpha:]].*$\)\n$/Book: \1 \2\n/g'
Aparentemente isso não funciona no terminal, mas funciona perfeitamente na versão VIM do sed
.
sed
lê a entrada linha por linha, então você não pode esperar encontrar uma string delimitada por novas linhas na entrada.No entanto, você pode corresponder a um único número inteiro, acrescentar a próxima linha a ele e trabalhar a partir daí:
Isso pula (apenas emite) todas as linhas que não são um número inteiro. Quando um único número inteiro é detectado, no entanto, a linha seguinte é adicionada ao final do buffer com
N
, com uma nova linha delimitadora entre as duas. Essa nova linha é substituída por um espaço usandos
, e inserimos o textoBook:
no início da linha.Se você sabe que o número inteiro ocorre na 1ª linha, você pode alterar o comando inicial de
/^[0-9][0-9]*$/!b
para o mais curto1!b
.Com
Perl
, no modo parágrafo:Usando Raku (anteriormente conhecido como Perl_6)
Raku é uma linguagem de programação completa na família Perl. Acima usamos o idioma
print
/ para combinar linhas. No Raku (como Perl), não adiciona automaticamente uma nova linha. O Raku também tem uma rotina, que significa Print-Using-Terminator , que adiciona um terminador de nova linha para você.put
print
\n
put
\n
Depois de reconhecer o novo operador ternário do Raku abaixo, você pode ver como ele (em combinação com
print
/put
) fornece a resposta desejada:Teste
??
Verdadeiro!!
Falso ;Exemplo de entrada:
Exemplo de saída:
https://docs.raku.org/language/5to6-nutshell#%3F_:_Ternary_operator
https://raku.org