Vous utilisez le mauvais outil pour le travail. sed
est un flux éditeur (c'est pourquoi il est appelé sed
), donc c'est pour l'édition en vol de flux dans un tuyau. ed
OTOH est un éditeur de fichier, qui peut faire tout ce que sed
peut faire, sauf qu'il fonctionne sur les fichiers au lieu des flux. (En fait, il est l'inverse. ed
est l'utilitaire original et sed
est un clone qui évite d'avoir à créer des fichiers temporaires pour les flux)
ed
fonctionne comme sed
(parce que sed
est juste un clone), mais avec une différence importante: vous pouvez vous déplacer dans les fichiers, mais vous ne pouvez pas vous déplacer dans les flux. Ainsi, toutes les commandes dans ed
prennent un paramètre d'adresse qui indique ed
, où dans le fichier pour appliquer la commande. Dans votre cas, vous voulez appliquer la commande partout dans le fichier, de sorte que le paramètre d'adresse est juste ,
parce que a,b
signifie « de la ligne a
à la ligne b
» et la valeur par défaut pour a
est 1
(début de fichier) et La valeur par défaut pour b
est $
(fin de fichier), donc les laisser tous les deux signifie "du début du fichier à la fin du fichier". Puis vient le s
(pour le remplacement) et le reste ressemble beaucoup à sed
. Par conséquent, votre commande sed
s/SO/so/
se transforme en commande ,s/SO/so/
.
Et, encore une fois parce que ed
est un éditeur de fichiers, et plus précisément, un éditeur de fichiers interactif, nous avons aussi besoin d'écrire (w
) le fichier et quittez (q
) l'éditeur.
C'est à quoi il ressemble dans son intégralité:
ed -- so/app.yaml <<-HERE
,s/SO/so/
w
q
HERE
Voir aussi my answer à une question similaire. Ce qui se passe dans votre cas, c'est que l'exécution d'un pipeline est un processus en deux étapes: construisez d'abord le pipeline, puis exécutez-le. >
signifie "ouvrir le fichier, tronquer il, et le connecter au filedescriptor 1 (stdout
)". Alors seulement est le canal réellement exécuté, c'est-à-dire que sed est exécuté, mais à ce moment, le fichier a déjà été tronqué.
Certaines versions de sed
ont également un paramètre pour -i
en place l'édition des fichiers, qui fait sed
se comporter un peu plus comme ed
, mais en utilisant ce n'est pas conseillé:, il ne abord supporte pas toutes les fonctionnalités de ed
, mais plus important encore, il s'agit d'une extension propriétaire non standard de GNU sed
qui ne fonctionne pas sur de nombreux systèmes non-GNU. Cela fait un moment que j'ai utilisé un système non-GNU, mais en dernier j'ai utilisé un, ni Solaris ni OpenBSD ni HP-UX ni IBM AIX sed
supporté le paramètre -i
.
À partir de la page de manuel: Il est déconseillé de donner une extension de longueur nulle lorsque vous modifiez des fichiers sur place, car vous risquez d'être corrompu ou partiellement contenu dans des situations où l'espace disque est épuisé, etc .. – Kaarel
J'ai lutté avec cela pendant les trente dernières minutes. – nlucaroni
Au cas où cela ne fonctionnerait pas pour vous: la version de 'sed' que vous utilisez ne supporte probablement pas' -i' - par exemple, dans Solaris. Souvent, là où c'est le cas, il y aura un 'gsed' quelque part qui le supporte. –