Como editar vários arquivos de texto com um único comando?

18

Quero remover a primeira linha de vários arquivos de texto e substituí-la por outra linha. Existe uma maneira de fazer isso usando o terminal?

Eu sei como usar o vim, existe uma maneira de automatizá-lo com ele? Quero evitar fazê-lo manualmente (como na edição de cada arquivo individualmente).

Se possível, gostaria de evitar a instalação de novas bibliotecas (especialmente para algo assim que considero muito simples - mas posso estar errado).

Desde já, obrigado!

TomTsagk
fonte

Respostas:

21

Você pode usar sed:

sed -i.bak '1s/^.*$/new line/' *.txt

Isso substituirá a primeira linha de todos os .txtarquivos no diretório atual pelo texto new line, altere-o para atender às suas necessidades.

Além disso, os arquivos originais serão copiados com .bakextensão, se você não quiser, basta usar:

sed -i '1s/^.*$/new line/' *.txt
heemail
fonte
Obrigado! sedé realmente o que eu estava procurando!
TomTsagk
@TomTsagk Ainda bem que pude ajudar :)
heemayl
11

Bem, usando- vimse:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

O que isso faz:

  • setline (n, text), bem, é uma função que define a linha ncomo text.
  • call é necessário para chamar funções.
  • bufdo é usado para repetir um comando entre buffers (sem um intervalo, ele atua em todos os buffers).
  • wqsalva e fecha o buffer. Precisamos fazer isso antes de passar para o próximo buffer, para que este comando seja encadeado ao callcomando usando |.
  • -c cmdexecuções cmdé um comando no modo de comando após carregar o primeiro buffer.
  • Nes ativa modo silencioso não compatível, ex-modo, o que é melhor para processamento não interativo.

Benefícios:

  • O setlineconteúdo do texto pode ser qualquer coisa - um &em um sedtexto de substituição pode ter efeitos indesejados.
muru
fonte
sedparece muito mais fácil de usar, mas é realmente incrível que vimpode fazer o mesmo! Muito obrigado pela sua resposta!
TomTsagk 01/08/2015
@ TomTsagk bem, eu só queria ilustrar como você pode agir em vários arquivos ( bufdo). Considere que você já possui os arquivos abertos e ... E para mostrar uma alternativa para 1s/foo/bar/.
muru 2/08/2015
Awesoming !!! <3_ <3
Campa 5/15
3

Algumas outras opções:

  • awk(precisa de uma versão relativamente nova do GNU awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / shell

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Shell / coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    
Terdon
fonte
2

Esse script fará o que você solicitou, colocando os arquivos alterados em um novo diretório sem realmente alterar os originais.

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done
Charles Boling
fonte
Eu estava respondendo lentamente (testei meu código) ... e eu gosto muito mais da solução heemayl!
Charles Boling
0

Usando gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

Exemplo

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4
AB
fonte
0

jEdit: Eu o uso para encontrar e substituir em massa. É poderoso com a capacidade de usar RegEx - Expressões regulares. Você pode operar em arquivos dentro de um diretório, especificar extensões, por exemplo, ".html" e assim por diante. E, você pode olhar para a localidade da mudança de candidato no contexto, em uma GUI. O jEdit é ótimo.

O jEdit está disponível no centro de software do Ubuntu.

Roger
fonte
0

Os comandos tail e cat fariam isso facilmente:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

Envolva-os em um loop adequado e talvez use um arquivo temporário adequado e correto, em vez de um nome de arquivo temporário codificado. Acredito que o bash e outros shells têm uma sintaxe para criar arquivos temporários.

A opção -n da cauda tem duas interpretações, dependendo se o argumento tem um sinal de mais. Se tiver um sinal de mais, significa mostrar a cauda do arquivo começando no número da linha fornecida. Caso contrário, o número é o número de linhas, incluindo a última linha, que a cauda deve produzir.

homem do espaço de cardiff
fonte