Question sed commande trouver et remplacer dans le fichier et le fichier d'écrasement ne fonctionne pas, il vide le fichier


Je voudrais lancer une recherche et remplacer sur un fichier HTML via la ligne de commande.

Ma commande ressemble à ceci:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html

Quand je cours ceci et regarde le dossier après, il est vide. Il a supprimé le contenu de mon fichier.

Lorsque je l'exécute après avoir restauré le fichier à nouveau:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

le stdout est le contenu du fichier, et la recherche et le remplacement ont été exécutés.

Pourquoi cela arrive-t-il?


508
2018-03-02 18:44


origine


Réponses:


Quand le coquille voit > index.html dans la ligne de commande, il ouvre le fichier index.html pour l'écriture, effaçant tout son contenu précédent.

Pour résoudre ce problème, vous devez passer le -i option à sed pour effectuer les modifications en ligne et créer une sauvegarde du fichier d'origine avant de faire les modifications sur place:

sed -i.bak s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

Sans le .bak, la commande échouera sur certaines plates-formes, telles que Mac OSX.


779
2018-03-02 18:48



Un modèle alternatif, utile, est:

sed -e 'script script' index.html > index.html.tmp && mv index.html.tmp index.html

Cela a beaucoup le même effet, sans utiliser le -i option, et signifie en outre que, si le script sed échoue pour une raison quelconque, le fichier d'entrée n'est pas entravé. En outre, si la modification est réussie, aucun fichier de sauvegarde n'est laissé de côté. Ce genre d'idiome peut être utile dans Makefiles.

Beaucoup de seds ont le -i option, mais pas toutes; le posix sed est celui qui ne le fait pas. Si vous visez la portabilité, il est donc préférable de l'éviter.


187
2018-03-02 22:32



sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' index.html

Ceci effectue une substitution globale sur place dans le fichier index.html. Citer la chaîne évite les problèmes d'espace dans la requête et le remplacement.


74
2017-08-09 20:58



utiliser l'option -i de sed, par ex.

sed -i bak -e s/STRING_TO_REPLACE/REPLACE_WITH/g index.html

50
2018-03-02 18:48



Pour changer plusieurs fichiers (et enregistrer une sauvegarde de chacun en tant que * .bak):

perl -p -i -e "s/\|/x/g" *  

va prendre tous les fichiers dans le répertoire et remplacer | avec x c'est ce qu'on appelle une "tarte Perl" (facile comme une tarte)


18
2018-06-20 20:54



Vous devriez essayer d'utiliser l'option -i pour l'édition sur place.


13
2018-03-02 18:49



Outre le -i option de sed vous pouvez utiliser le tee utilitaire.

De man:

Té - lire depuis l'entrée standard et écrire sur la sortie standard et les fichiers

Donc, la solution serait:

sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html

4
2017-07-16 22:06



Le problème avec la commande

sed 'code' file > file

est-ce file est tronqué par le shell avant que sed ne puisse le traiter. Par conséquent, vous obtenez un fichier vide.

La façon de faire cela est d'utiliser -i pour éditer en place, comme d'autres réponses suggérées. Cependant, ce n'est pas toujours ce que vous voulez. -i va créer un fichier temporaire qui sera ensuite utilisé pour remplacer le fichier d'origine. Ceci est problématique si votre fichier d'origine était un lien (le lien sera remplacé par un fichier normal). Si vous devez conserver des liens, vous pouvez utiliser une variable temporaire pour stocker la sortie de sed avant de l'écrire dans le fichier, comme ceci:

tmp=$(sed 'code' file); echo -n "$tmp" > file

Mieux encore, utilisez printf au lieu de echo depuis echo est susceptible de traiter \\ comme \ dans certains réservoirs (par exemple, tiret):

tmp=$(sed 'code' file); printf "%s" "$tmp" > file

4
2017-07-29 22:21



sed -i.bak "s#https.*\.com#$pub_url#g" MyHTMLFile.html

Si vous avez un lien à ajouter, essayez ceci. Recherchez l'URL ci-dessus (en commençant par https et en terminant par.com ici) et remplacez-la par une chaîne URL. J'ai utilisé une variable $pub_urlici. s ici signifie rechercher et g signifie remplacement global.

Ça marche !


4
2017-10-09 06:24



Et le ed répondre:

printf "%s\n" '1,$s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' w q | ed index.html

Pour réitérer ce que codaddict a répondu, le shell gère la redirection premier, effaçant le fichier "input.html", et puis le shell invoque la commande "sed" en lui passant un fichier maintenant vide.


3
2018-06-28 01:07