Como enumerar linhas específicas de um arquivo

3

Eu quero saber como enumerar linhas específicas, neste caso, apenas aquelas após as linhas com os colchetes

Arquivo original: file.txt

TITLE: hello world 
SUBTITLE: document about hello world    

[CONTENT 1]   
That's a line   
Another one   
Row    

[EXAMPLE]    
Example line   

[CONTENT 2]   
A  
B   
C   

Text, text, text....

Resultado desejado: file.txt

TITLE: hello world 
SUBTITLE: document about hello world    

[CONTENT 1]   
1 That's a line   
2 Another one   
3 Row    

[EXAMPLE]    
5 Example line   

[CONTENT 2]   
6 A  
7 B   
8 C   

Text, text, text....
    
por reuseman 05.08.2017 / 10:18

2 respostas

1
perl -pe 's/^/++$a.$"/e if /^\[/ ... /^$/ and /^(?!\[)./' file.txt

Resultados

TITLE: hello world
SUBTITLE: document about hello world

[CONTENT 1]
1 That's a line
2 Another one
3 Row

[EXAMPLE]
4 Example line

[CONTENT 2]
5 A
6 B
7 C

Text, text, text....

Explicação

  • A opção -p processa o arquivo linha por linha + a autoprint está ativada.
  • s/^/.../e prefixará o contador e um espaço ( $" = separador de lista = espaço por padrão)
  • O modificador /e do comando substituto tratará o RHS como código Perl a ser avaliado e o resultado colocado como resultado da substituição.
  • A substituição ocorre apenas quando a regex a seguir é selecionada:
    • /^\[/ .. /^$/ = > isso seleciona um intervalo de linhas a partir de uma linha que começa com um colchete de abertura e o intervalo termina quando uma linha vazia é encontrada.
    • O intervalo é ainda mais refinado selecionando uma linha que rejeita os limites do intervalo, isto é, correspondendo a uma linha que tenha pelo menos um caractere e a linha não comece com um colchete de abertura. Então, somente quando estes dois são atendidos, a substituição acontece, OTW as linhas são deixadas ir como está.
  • A opção autoprint imprimirá a linha finalmente.
por 05.08.2017 / 10:54
2
Solução

awk :

awk '/^\[.+\]/{ f=1 }f && $0~/^\w/{ $0=++c FS $0 }!NF{ f=0 }1' file
  • /^\[.+\]/{ f=1 } - correspondendo uma linha com colchetes e marcando-a com f flag

  • f && $0~/^\w/{ $0=++c FS $0 } - adiciona o valor do contador para as linhas após a linha "com colchetes"

  • !NF{ f=0 } - ignorando as linhas vazias e as seguintes ( f=0 - reinicializando o sinalizador que implica ação do contador)

A saída:

TITLE: hello world 
SUBTITLE: document about hello world    

[CONTENT 1]   
1 That's a line   
2 Another one   
3 Row    

[EXAMPLE]    
4 Example line   

[CONTENT 2]   
5 A  
6 B   
7 C   

Text, text, text....
    
por 05.08.2017 / 11:04