2 votes

Comment supprimer toutes les lignes sauf la dernière en utilisant un éditeur unix ed à partir d'un script bash script ?

J'ai le fichier bash suivant appelé "file" (le vrai fichier fait quelque chose d'utile) :

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

Lorsque j'exécute "bash file", aucune ligne n'est supprimée. Si j'utilise 1d au lieu de 1,$-1d il supprime effectivement la première ligne.

Pourquoi cela ne fonctionne-t-il pas ? Je pourrais facilement trouver une solution de contournement, mais je suis curieux de savoir pourquoi cela ne fonctionne pas.

1voto

Abbas Points 3737

sed est plus simple dans ce cas. Choisissez l'une des options suivantes

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

L'erreur dans votre code est que le Shell se développe $- avant de passer le script à ed . Cela fonctionnera :

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

0voto

Le problème est que le Shell interprète l'élément $ dans le 1,$-1d commande. (Plus précisément, dans mes tests, il interprète $- en tant que collection de set drapeaux). La meilleure façon d'y remédier est de mettre entre guillemets ou d'échapper l'élément EOF comme dans

ed db/seeds.rb <<\EOF

ou

ed db/seeds.rb <<"EOF"

Il est également possible d'échapper (c'est-à-dire de mettre une barre oblique inverse devant) à chaque $ dans votre "document ici".

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X