precede o texto para todos os arquivos em uma pasta [duplicada]

2

Eu quero preceder um texto contido no arquivo disclaimer.txt para todos os arquivos .m em uma pasta.

Eu tentei o seguinte:

text=$(cat ./disclaimer.txt)

for f in ./*.m
do
   sed -i '1i $text' $f
done

mas apenas adiciona uma linha vazia.

    
por shamalaia 19.12.2017 / 12:03

2 respostas

8

Existem várias maneiras de fazer isso, mas aqui está uma primeira tentativa rápida:

#!/bin/sh
for file in *.m; do
    cat disclaimer.txt $file >> $file.$$
    mv $file.$$ $file
done

Ele concatena o aviso junto com o arquivo original em um novo arquivo temporário e substitui o arquivo original pelo conteúdo do arquivo temporário.

    
por 19.12.2017 / 12:22
5

Existem dois problemas com isso:

sed -i '1i $text' $f

Primeiro, a variável não é expandida entre aspas simples, por isso sed vê a string literal 1i $text .

O segundo problema é que o comando i espera uma barra invertida e a linha a ser adicionada em uma segunda linha, então é necessário fazer algo assim:

$ text="blah"
$ sed -i $'1i\\n'"$text"$'\n' "$file"

(em shells com a expansão $'...' ou com novas linhas literais em shells que não suportam isso.)

Além disso, o comando i só pode adicionar uma linha, as linhas a seguir seriam tomadas como comandos sed adicionais.

Embora se você tiver o GNU sed, apenas sed -i "1i $text" "$f" deve funcionar. Mas você ainda recebe apenas uma linha.

Para várias linhas, provavelmente é melhor algo parecido com o que o @mjturner mostrou em sua resposta.

    
por 19.12.2017 / 12:41