Como eu adiciono texto ao início e ao final de vários arquivos de texto no Bash?

24

Eu tenho um diretório cheio de arquivos de texto. Meu objetivo é acrescentar texto ao começo e ao fim de todos eles. O texto que vai no começo e no final é o mesmo para cada arquivo.

Com base no código que recebi da Web, este é o código para anexar ao início do arquivo:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

Este é o código para anexar ao final do arquivo. O objetivo é adicionar o texto }; no final de cada arquivo:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

Os exemplos de que eu tirei foram para atuar em arquivos individuais. Eu pensei em tentar atuar em vários arquivos usando o curinga, *.txt .

Eu também estou cometendo outros erros. Em qualquer caso, como eu adiciono texto ao início e ao final de vários arquivos?

    
por Questioner 20.02.2013 / 19:00

8 respostas

25

Para pré-texto em um arquivo que você pode usar (com a implementação GNU de sed ):

sed -i '1i some string' file

Anexar o texto é tão simples quanto

echo 'Some other string' >> file

A última coisa a fazer é colocar isso em um loop que interage sobre todo o arquivos que você pretende editar:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done
    
por 20.02.2013 / 19:15
8

Você pode usar o GNU sed

Como já ilustrado, você pode inserir linhas de texto antes e depois de corresponder as linhas de um arquivo com sed , usando o comando i e a , respectivamente. O que não foi mostrado é que você pode fazer isso com um one-liner e vários arquivos de uma só vez.

O seguinte irá inserir uma linha antes do primeiro 1i e após a última linha $a . As inserções serão executadas para todos os arquivos correspondentes ao glob *.txt .

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

Tanto i quanto a não trabalham apenas com números de linha, mas também em todas as linhas que correspondem a um determinado padrão. Isso inseriria um comentário sempre que uma linha contiver var y = 2; :

sed -i -- '/var y = 2;/i//initialize variable y' *.js
    
por 21.02.2013 / 03:42
4

Comando totalmente compatível com POSIX, usando ex :

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

Se você executar a parte printf do comando por si só, verá os comandos de edição exatos que está passando para ex :

0a
var language = {
.
$a
};
.
x

0a significa "Anexar texto após linha 0" (em outras palavras, antes da primeira linha). A próxima linha é o texto literal para "anexar" após a linha 0. O período ( . ) em uma linha por si só encerra o texto a ser anexado.

$a significa anexar texto após a última linha do arquivo.

x significa salvar as alterações e sair.

    
por 14.10.2016 / 22:35
2

Aqui está uma maneira de fazer isso em Perl:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done
    
por 24.01.2014 / 18:23
1

Tente usar ex :

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

onde os comandos são:

  • bufdo! executa os comandos abaixo para cada buffer / arquivo aberto (nota: não é POSIX )
  • 1s/^/HEAD/ - insere HEAD text na primeira linha no início da linha
  • $s/$/TAIL/ - acrescenta TAIL text na última linha no final da linha

e os argumentos são:

  • -s - modo silencioso / rápido
  • -cxa - salva todos os buffers / arquivos abertos e sai
  • *.foo - todos os arquivos no diretório atual ( * ) com foo extension, use **/*.foo para recursividade (depois de ativar globstar: shopt -s globstar )
por 12.08.2015 / 11:40
1

Com gnu awk , usando a extensão inplace e BEGINFILE / ENDFILE :

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
    
por 14.10.2016 / 21:46
1

Também tem o direito de estar (com resultados em .out files):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

Outra variante mais elaborada - arquivos de origem substituídos por resultado:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print
    
por 14.11.2014 / 14:57
0

Perl one-liner para o resgate:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
    
por 18.11.2016 / 13:37