Como uso o sed para inserir uma linha no topo do meu arquivo?

2

Estou usando o shell bash no Amazon Linux. Estou tentando inserir uma linha no topo do meu arquivo para que eu tenha

header_line="first_line_of_file"
...
    sed -i "1 i\$header_line" /tmp/$file_title

No entanto, o que realmente aparece no topo do meu arquivo é

$header_line

Como eu digo ao sed para não interpretar minha variável literalmente, mas prefiro usar o valor da variável para inserir no topo do meu arquivo?

    
por Dave 04.05.2017 / 22:19

1 resposta

4

Se você está usando o GNU ou busybox , sed , então você deve ser capaz de fazer

sed -i "1i $header_line" "/tmp/$file_title"

O problema que você teve foi o de escapar do $ do shell para que ele não reconhecesse $header_line como uma variável.

Com NetBSD ou OpenBSD sed (também com FreeBSD e macOS, mas você precisa de um espaço entre -i e '' ):

sed -i'' "1i\
$header_line
" "/tmp/$file_title"

BSD sed , como implementações tradicionais de sed , e conforme especificado por POSIX, requer \ e uma nova linha literal após o comando i , e como estamos duplicando aspas, precisamos escapar do \ do shell.

Uma alternativa seria usar cat :

printf '%s\n' "$header_line" | cat - "/tmp/$file_title" >new_file && mv new_file "/tmp/$file_title"

Isso também ignora problemas com barras invertidas no valor de $header_line mencionado por Stéphane Chazelas nos comentários abaixo.

    
por 04.05.2017 / 22:23