bash - remplacer - sed supprimer caractere speciaux




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

Avec tout le respect dû aux bonnes réponses ci-dessus, c'est toujours une bonne idée de "faire tourner" des scripts comme ça, afin de ne pas corrompre votre fichier et de recommencer à zéro.

Obtenez juste votre script pour renverser la sortie à la ligne de commande au lieu de l'écrire dans le fichier, par exemple, comme ça:

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

OU

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

De cette façon, vous pouvez voir et vérifier la sortie de la commande sans que votre fichier ne soit tronqué.

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

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

Pourquoi cela arrive-t-il?


En plus de l'option -i de sed vous pouvez utiliser l' utilitaire tee .

De l' 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

Je cherchais l'option où je peux définir la gamme de lignes et trouvé la réponse. Par exemple, je veux changer host1 en host2 à partir de la ligne 36-57.

sed '36,57 s/host1/host2/g' myfile.txt > myfile1.txt

Vous pouvez également utiliser l'option gi pour ignorer le cas de caractère.

sed '30,40 s/version/story/gi' myfile.txt > myfile1.txt

Le problème avec la commande

sed 'code' file > file

Ce file est tronqué par le shell avant que sed ne le traite réellement. Par conséquent, vous obtenez un fichier vide.

La façon de faire cela est d'utiliser -i pour éditer sur 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 original é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 d' echo puisque echo est susceptible de traiter \\ as \ dans certains shells (par exemple dash):

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

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

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

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


Un modèle alternatif et 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 l'option -i , et signifie en outre que, si le script sed échoue pour une raison quelconque, le fichier d'entrée n'est pas clobé. 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 l'option -i , mais pas tous; le posix sed est celui qui ne le fait pas. Si vous visez la portabilité, il est donc préférable de l'éviter.


Vous pouvez utiliser Vim en mode Ex:

ex -sc '%s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g|x' index.html
  1. % sélectionner toutes les lignes

  2. x enregistrer et fermer


utiliser l'option -i de sed, par exemple

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

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 with.com ici) et remplacez-la par une chaîne d'URL. J'ai utilisé une variable $pub_url ici. s signifie ici que la recherche et g signifie le remplacement global.

Ça marche !





sed