Adicione números de linha se determinado padrão corresponder

0

Eu tenho um arquivo para o qual gostaria de adicionar números de linha seletivamente. Digamos que a string de destino comece com INIT "command", em que command é uma string de texto variável. Eu quero que seja INIT "comando linenumber". A ideia é que cada linha INIT seja marcada com um ID único ordenado, mas não necessariamente contíguo. Esse id único poderia ser o seu número de linha. Bônus (praticamente claro!) Se o número puder ser hexadecimal.

EDITAR:

Exemplo de entrada

#: ../src/app-utils/business-prefs.scm:24
msgid "Counters"
msgstr ""

Exemplo de saída

#: ../src/app-utils/business-prefs.scm:24
msgid "123f>Counters"
msgstr "123f>شمارنده‌ها"

O arquivo é preenchido com milhares desses pares msg . As tags msgid e msgstr correspondem, portanto, devem ter o mesmo código. Com o código abaixo eu rodaria duas vezes e mudaria o parâmetro interno. Eu acho que tenho que alterar alguns números no código para adaptá-lo para a amostra. Eu adicionei ">" apenas para tornar mais fácil reconhecer o código a partir da cadeia de caracteres real, ou seja, alguns embelezamentos.

    
por Hamid 21.12.2016 / 23:21

1 resposta

1

Não tenho certeza se isso é exatamente o que você quer (você ainda não forneceu os exemplos requestd), mas aqui está uma tentativa de resolvê-lo com um pequeno script Python. Ele lê os dados da entrada padrão e os imprime na saída padrão, inserindo um número de índice em notação hexadecimal em cada linha que começa com "INIT":

#! /usr/bin/env python3
import sys

i = 0 if len(sys.argv) == 1 else int(sys.argv[1])
while True:
    line = sys.stdin.readline()
    if not line:
        break
    if line.startswith("INIT "):
        print(line[:5] + hex(i)[2:] + line[4:], end="")
        i += 1
    else:
        print(line, end="")

Salvei o script acima como numberinit.py e tornei-o executável usando chmod +x numberinit.py .

Você deve executá-lo de uma destas duas maneiras:

./numberinit.py < INPUTFILE
./numberinit.py STARTINDEX < INPUTFILE

INPUTFILE é o arquivo que você deseja ler e o parâmetro opcional STARTINDEX permite especificar o primeiro índice a ser usado, o padrão é 0.

Exemplo de uso:

$ cat example.txt 
my input file
INIT first
INIT second
stuff in between
INIT third
INIT something longer as fourth

$ ./numberinit.py < example.txt 
my input file
INIT 0 first
INIT 1 second
stuff in between
INIT 2 third
INIT 3 something longer as fourth

$ ./numberinit.py 42 < example.txt 
my input file
INIT 2a first
INIT 2b second
stuff in between
INIT 2c third
INIT 2d something longer as fourth

Você pode, naturalmente, redirecionar a saída do comando para salvá-lo em um arquivo diferente, mas não use o mesmo arquivo de entrada e saída (truncará o arquivo devido ao modo como o shell lida com redirecionamentos):

./numberinit.py < input.txt > output.txt
    
por Byte Commander 22.12.2016 / 00:15