Tipo Unix

Tipo Unix

Estou tentando fazer uma coisa bem simples. Tenho 40 arquivos de texto nos quais preciso deletar tudo e substituir pelo conteúdo de um arquivo de texto modelo.

Qual é a maneira mais fácil/rápida?

NB: Não quero pesquisar e substituir, mas sim apagar tudo e depois copiar dentro. Seria como abrir o arquivo, ctrl + A >> del >> ctrl + v para cada arquivo

Responder1

Tipo Unix

Em uma linha de comando do tipo Unix (no Linux, OSX, etc.), você pode usar catpara imprimir o conteúdo de um arquivo em STDOUT e >redirecionar STDOUT para um arquivo, sobrescrevendo seu conteúdo.

cat template.txt > file.txt

A maneira mais fácil é colocar template.txtem um diretório separado, então você pode usar um loop for para afetar cada *.txt no diretório de trabalho:

for f in ./*.txt; do cat /path/to/template.txt > "$f"; done

Em sistemas com bash 4+ (qualquer *nix moderno provavelmente terá isso; verifique com bash --version), você pode usar globbing estendido, para que possa ter template.txtno mesmo diretório dos arquivos que deseja sobrescrever:

shopt -s extglob
for f in ./!(*template).txt; do cat template.txt > "$f"; done

Se você tiver arquivos de texto em muitos subdiretórios (AVISO: ISTO SERÁ SOBRESCRITOTODOS *.txtARQUIVOS NO DIRETÓRIO DE TRABALHO E TODOS OS SEUS SUB-DIRETÓRIOS, E TODOS OS SEUS SUB-DIRETÓRIOS...), você pode usar globstar:

shopt -s globstar
for f in ./**/*.txt; do cat /path/to/template.txt > "$f"; done

##  OR:
shopt -s globstar extglob
for f in ./**/!(*template).txt; do cat template.txt > "$f"; done

janelas

Isso funciona de forma semelhante, embora a sintaxe seja diferente. Em vez de cat, use type:

type template.txt > file.txt

Para trabalhar em todos .txtem um diretório:

FOR %F IN (*.txt) DO type C:\path\to\template.txt > %F

Para recursividade, use /R:

FOR /R %F IN (*.txt) DO type C:\path\to\template.txt > %F

Responder2

Bem, o que você deseja pode ser feito por uma pesquisa e substituição automatizada (como o que o powergrep faz, mas de graça), mas é mais fácil simplesmente pegar o modelo e copiá-lo a cada novo arquivo. Isso pode ser feito na linha de comando.

Crie um arquivo com uma lista de todos os nomes de arquivos nos quais você deseja colocar esse modelo.

Então listoffiles.txt tem conteúdo:

arquivo1.txt
arquivo2.txt
arquivo3.txt

Em seguida, abra um prompt cmd e faça:

C:\fdf>for /f %f in (listoffiles.txt) faça @echo copy template.txt %f

copiar template.txt arquivo1.txt
copiar template.txt arquivo2.txt
copiar template.txt arquivo3.txt

C:\fdf>

Basta alterar a linha @echo copy template.txt para ler copy template.txt. ou seja, remova o @echo ou apenas o echo.

Você precisa de listoffiles.txt em c:\fdf e template.txt lá também. E criará arquivo1.txt arquivo2.txt etc.

informação relacionada