Adiciona uma string a um arquivo de texto do terminal

6

Eu gostaria de modificar um monte de arquivos de texto do terminal, mais precisey:

adicione a string '50' à primeira linha de cada arquivo de texto em / mydat /?

Como alternativa, se você souber de um link para uma página na web que lista comandos para manipular arquivos de texto do shell ...

    
por user2413 02.11.2010 / 19:46

5 respostas

7

find e sed são suas armas de escolha:

find /mydat/ -exec sed '1i 50' {} \;

Isso vai colocar 50 seguido por uma nova linha no começo do arquivo.

Como alternativa, se você não precisar de recursão ou seletores complexos para find , poderá soltar find completamente:

sed '1i 50' *
    
por Oli 02.11.2010 / 19:53
3

Para editar um arquivo, você precisa de um editor. ed e ex são exemplos de editores baseados em comandos, o que é útil para editar arquivos de um script. Aqui está um exemplo inserindo uma linha em todos os arquivos com extensão .txt em / mydata, usando ed:

#!/bin/bash
for file in /mydata/*.txt; do
    printf '%s\n' 0a 50 . w | ed -s "$file"
done

Isso também irá lidar com todos os tipos de caracteres estranhos nos nomes dos arquivos, ao contrário de todos os exemplos que usam for -loops com ls nas respostas dadas até agora.

Aqui está um link descrevendo como usar o ed: link

Para se familiarizar com o bash, recomendo vivamente que leia o link

    
por geirha 20.01.2011 / 21:26
2

Essencialmente, você precisa percorrer todos os arquivos de texto em um diretório e, em seguida, adicionar uma pequena seqüência ao início. Não é difícil quando você divide em duas etapas.

Para adicionar a string ao início de um arquivo, o formato seria este:

echo "50 $( cat file.txt )" > file.txt

Se você receber um erro cannot overwrite existing file , precisará desativar o noclobber

set +o noclobber

Agora você só precisa soltar isso em um loop que percorre os arquivos que deseja alterar.

for FILE in $( ls /mydata/ | grep txt$ ) ; do
  echo "${FILE}"
done

Se isso gerar todos os arquivos que você deseja alterar corretamente, inclua o comando para alterar os arquivos (conforme abaixo). Caso contrário, altere a instrução grep até que ela corresponda ao que você precisa.

for FILE in $( ls /mydata/ | grep txt$ ) ; do
  echo "50 $( cat ${FILE} )" > "${FILE}"
done

E se você quiser em uma linha:

for FILE in $( ls /mydata/ | grep txt$ ) ; do echo "50 $( cat ${FILE} )" > "${FILE}"; done

Editar

Se você quiser o 50 em sua própria linha, use printf junto com \n em vez de eco, como abaixo.

for FILE in $( ls /mydata/ | grep txt$ ) ; do printf "50\n$( cat ${FILE} )" > "${FILE}"; done
    
por tj111 02.11.2010 / 19:57
2

Desde que você perguntou, commandlinefu.com lista um monte de comandos e truques para usar no shell, e tem muita coisa sobre manipulação de arquivos de texto.

    
por Firefeather 08.11.2010 / 00:45
1

É relativamente simples adicionar texto ao final dos arquivos. Para BASH: echo 50 >> file.txt acrescentará 50 ao final do arquivo.txt. Encerre isso em um loop for assim: for $FILE in 'ls' do echo 50 >> $FILE; done; for $FILE in * do echo 50 >> $FILE; done; irá iterar todos os arquivos no diretório atual acrescentando 50 ao final. Observe que as aspas simples são na verdade ', mas esse é o indicador da marcação de código aqui ... blech. Para adicioná-lo ao topo de cada arquivo, crie um arquivo temporário e faça o eco 50 nele. eco o conteúdo do arquivo depois disso. Em seguida, renomeie o arquivo para substituir o original. Envolva-o em um roteiro e pronto!

#!/bin/bash

echo "Adding 50 to each file in current directory."

for $FILE in *
do
[[ -f "$i" ]] || continue
echo "50" >> tmp
cat "$FILE" >> tmp
mv tmp "$FILE"
done

Isso deve funcionar, mas executá-lo em um diretório de teste antes de qualquer coisa importante.

Edit: Atualizou o script como sugerido no comentário de Mahesh.

    
por Nick Pascucci 02.11.2010 / 19:55