Como excluo todas as linhas, mas a última usando o editor unix ed de um script bash

2

Eu tenho o seguinte arquivo bash chamado "file" (o real faz algo útil):

ed db/seeds.rb <<EOF
1,$-1d
a
123
456
.
w
q
EOF

Quando eu executo "bash file" ele não apaga nenhuma linha. Se eu usar 1d em vez de 1,$-1d , exclua a primeira linha.

Por que isso não funciona? Eu poderia facilmente fazer uma solução, mas estou curioso para saber por que isso não funciona.

    
por Fred Finkle 20.08.2014 / 18:40

2 respostas

0

O problema é que o shell está interpretando o $ no comando 1,$-1d . (Especificamente, nos meus testes, ele interpreta $- como a coleção de set flags.) A melhor maneira de corrigir isso é citar ou escapar da string EOF , como em

ed db/seeds.rb <<\EOF

ou

ed db/seeds.rb <<"EOF"

Como alternativa, você pode escapar (ou seja, colocar uma barra invertida na frente de) cada $ no seu "documento aqui".

    
por 20.08.2014 / 23:22
1

sed é mais simples neste caso. Escolha um de:

sed -i -n '$p' file
sed -i '$!d' file

O erro com o seu código é que o shell está expandindo $- antes de passar o script para ed . Isso vai funcionar:

# quoting the heredoc word:
ed db/seeds.rb <<'EOF'
1,$-1d
w
q
EOF
    
por 20.08.2014 / 19:44