Extraia um número em cada linha e adicione outro número a ele

2

Eu tenho um arquivo cujo conteúdo é

(bookmarks
 ("Cover"
  "#01.djvu" )
 ("Title page"
  "#all_24223_to_00243.cpc0002.djvu" )
 ("Preface"
  "#all_24223_to_00243.cpc0004.djvu" )
 ...

Eu quero mudar seu conteúdo para ser

(bookmarks
 ("Cover"
  "#2" )
 ("Title page"
  "#3" )
 ("Preface"
  "#5" )
...

mantendo o número antes de .djvu , removendo zeros à esquerda e adicionando um a ele. Gostaria de saber como você faria isso usando o awk?

Obrigado.

    
por Tim 16.03.2018 / 02:58

3 respostas

5

Isso é mais um trabalho para perl :

perl -pe 's/"#\K.*?(\d+)\.djvu(?=")/$1+1/ge' <file

Com variável:

INCR=1 perl -pe 's/"#\K.*?(\d+)\.djvu(?=")/$1+$ENV{INCR}/ge' <file

Ou:

perl -spe 's/"#\K.*?(\d+)\.djvu(?=")/$1+$incr/ge' -- -incr=1 <file
    
por 16.03.2018 / 10:14
1

Aqui está uma solução awk do GNU:

awk  '/^ *\(/{print}!/^ *\(/{split($1,aa,"[0-9]+",bb);printf "\"#%s\" )\n", bb[length(bb)]+1}'

ou idênticos, mas espalhados por algumas linhas para facilitar a leitura:

awk  '/^ *\(/ { print }
     !/^ *\(/ { split( $1, aa, "[0-9]+", bb )
                printf "\"#%s\" )\n", bb[length(bb)]+1 }'
  1. /^ *\ e !/^ *\(/ são duas regras de endereço, cobrindo linhas que começam com espaços opcionais e um parêntese aberto ... e linhas que não o fazem.

  2. split( $1, aa, "[0-9]+", bb ) Para linhas que não são, divida a linha em duas matrizes. aa é o conteúdo da linha delimitado pela regex "[0-9] +" e bb são os delimitadores que correspondem à regex. O elemento final de bb é o que lhe interessa.

  3. printf "\"#%s\" )\n" formata a linha de saída, aguardando uma única variável ...

  4. bb[length(bb)]+1 one mais o valor do último elemento de bb.

por 16.03.2018 / 09:33
1
gawk '{
    sub(/#.*\.djvu/, "#" $1 + 1 ".djvu")
    print
}' FPAT='[0-9]+\.djvu' input.txt

A ideia é a seguinte:

  • extraia a extensão .djvu com os números iniciais do nome do arquivo djvu , usando o padrão [0-9]+\.djvu ( FPAT ). Exemplo : o nome do arquivo original é #all_24223_to_00243.cpc0002.djvu , a parte extraída será 0002.djvu .
  • substitua o djvu filename #.*\.djvu anterior pelo anterior, aumentando-o em 1 anteriormente. Exemplo : pegue a linha inteira $0 e substitua #all_24223_to_00243.cpc0002.djvu dentro dela, para 0002.djvu + 1 (essa expressão resulta para o número simples 3 , devido à maneira como a string para conversão numérica funciona o código%). Adicione o sinal gawk e # a ele. Resultado : .djvu .

Esta solução funcionará apenas para linhas com um #3.djvu filename, como em sua entrada de amostra.

Entrada

(bookmarks
 ("Cover"
  "#01.djvu" )
 ("Title page"
  "#all_24223_to_00243.cpc0002.djvu" )
 ("Preface"
  "#all_24223_to_00243.cpc0004.djvu" )

Resultado

(bookmarks
 ("Cover"
  "#2.djvu" )
 ("Title page"
  "#3.djvu" )
 ("Preface"
  "#5.djvu" )
    
por 17.03.2018 / 11:05

Tags