Adiciona um texto de várias linhas com uma variável a vários arquivos usando o bash

0

Eu quero criar um script que coloque um texto de várias linhas como cabeçalho em vários arquivos com extensão txt . Mas o texto a ser inserido também inclui o nome do arquivo no qual ele será inserido.

Aqui vai o texto a ser inserido:

abcdgd FILENAME dhsgabc 
shcnwk shfgamvk 
cjshjg nwdcbi 
skfh 
nwvjcnd
skfh dvwuv
fshvur

egfbt hethtn nhnh

gdngng  dehdnnrty

Eu tenho muitos arquivos, com o nome 001.txt, 002.txt, 003.txt e assim por diante. O NAMEFILE precisa ser apenas 001, 002, 003 e assim por diante (sem a extensão .txt ).

    
por alloppp 21.01.2016 / 13:23

2 respostas

2

Você deve conseguir fazer isso com um simples loop de shell sobre um documento aqui. Por exemplo, dados os arquivos 001.txt a 005.txt da forma

$ cat 003.txt 
=== START OF ORIGINAL FILE 003 ===
stuff
more stuff
even more stuff

então

for i in {001..005}; do cat - "$i.txt" <<EOF >tmpfile
+++ HEADER $i +++
new stuff
more new stuff

EOF
mv tmpfile "$i.txt"
done

resulta em arquivos do formulário

$ cat 003.txt 
+++ HEADER 003 +++
new stuff
more new stuff

=== START OF ORIGINAL FILE 003 ===
stuff
more stuff
even more stuff

e assim por diante.

    
por steeldriver 21.01.2016 / 14:54
1

O script abaixo faz o trabalho recursivamente.

Usando exatamente o texto do seu exemplo:

#!/usr/bin/env python3
import os
import sys

dr = sys.argv[1]

def addlines(file):
    """
    the list below contains the lines, to be added at the top. The lines will
    appear in separate lines. In case you want to add an extra line break, use
    \n like in the last two lines in the example- content below.
    """
    return [
        "abcdgd "+file.replace(".txt", "")+" dhsgabc",
        "shcnwk shfgamvk",
        "cjshjg nwdcbi",
        "skfh",
        "nwvjcnd",
        "skfh dvwuv",
        "fshvur",
        "\negfbt hethtn nhnh",
        "\ngdngng  dehdnnrty",
        ]

for root, dirs, files in os.walk(dr):
    for file in files:
        path = root+"/"+file
        # first read the file and edit its content
        with open(path) as new:
            text = ("\n").join(addlines(file))+"\n"+new.read()
        # then write the edited text to the file
        with open(path, "wt") as out:
            out.write(text)

Altera um arquivo chamado:

Liesje leerde Lotje lopen.txt

com conteúdo:

aap
noot

para:

abcdgd Liesje leerde Lotje lopen dhsgabc
shcnwk shfgamvk
cjshjg nwdcbi
skfh
nwvjcnd
skfh dvwuv
fshvur

egfbt hethtn nhnh

gdngng  dehdnnrty
aap
noot

Como usar

  1. Copie o script em um arquivo vazio, salve-o como change_file
  2. Altere a função addlines(file) do texto (mas não toque em +file.replace(".txt", "")+ . \n significa uma quebra de linha (n extra).
  3. Execute-o com o diretório de destino como um argumento (o diretório com seus arquivos):

     
     python3 /path/to/change_file /directory
    

    se /directory incluir espaços, use aspas:

     python3 /path/to/change_file '/directory'
    

Nota

Se os arquivos são realmente enormes , podemos precisar otimizar o procedimento em uma abordagem por linha , mas em situações comuns, isso deve funcionar bem. / p>     

por Jacob Vlijm 21.01.2016 / 13:56