sed inserir no início de vários arquivos não está funcionando

4

Me deparei com muitas respostas, incluindo teses:

E não consigo encontrar uma maneira de fazer o que quero fazer. Eu preciso inserir #encoding:utf-8 no início de cada arquivo .html.erb do meu diretório (recursivamente). Eu tentei usar este comando

find . -iname "*.erb" -type f -exec sed -ie "1i \#encoding:utf-8" {} \;

Mas isso gera esse erro:

sed: 1: "1i #encoding:utf-8": extra characters after \ at the end of i command

    
por Thomas Ayoub 20.04.2015 / 10:39

3 respostas

5

Para editar o arquivo no local com OSX sed , você precisa definir a extensão vazia:

$ sed -i '' '1i\
#encoding:utf-8' filename

E você precisa de uma nova linha literal após i\ . Isso é especificado por POSIX sed .

Apenas o GNU sed permite que o texto seja inserido na mesma linha com o comando.

sed também pode trabalhar com vários arquivos de uma só vez, então você pode usar -exec command {} + form:

$ find . -iname "*.erb" -type f -exec sed -i '' '1i\
#encoding:utf-8' {} +
    
por 20.04.2015 / 10:46
1

Aqui estão algumas maneiras de fazer o que você quer:

  1. sed

    find . -iname "*.erb" -type f -exec \
     sed -i '' '1s/^/#encoding:utf-8\n/' {} \;
    

    Eu não tenho acesso a um BSD sed para verificar, por isso não posso garantir que \n seja lido corretamente. Experimente o comando em um único arquivo e sem o -i primeiro para ter certeza.

  2. Perl

    find . -iname "*.erb" -type f -exec \
        perl -i -pe 'print "#encoding:utf-8\n" if $.==1;' {} \;
    
  3. shell

    find . -iname "*.erb" -type f -exec \
        sh -c 'echo "#encoding:utf-8" >tmp && cat "$1" >> tmp && mv tmp "$1"' sh {} \;
    
por 20.04.2015 / 14:43
0

Você pode usar o Vim no modo Ex:

ex -sc '1i|#encoding:utf-8' -cx file
  1. 1 selecione a linha 1

  2. i inserir texto e nova linha

  3. x salvar e fechar

por 17.04.2016 / 06:51