J'ai un projet Visual Studio, qui est développé localement. Les fichiers de code doivent être déployés sur un serveur distant. Le seul problème est que les URL qu'ils contiennent sont codées en dur.
Le projet contient des URL telles que ? Page = one . Pour que le lien soit valide sur le serveur, il doit être / page / one .
J'ai décidé de remplacer toutes les URL de mes fichiers de code par sed avant le déploiement, mais je suis bloqué sur les barres obliques.
Je sais que ce n'est pas une jolie solution, mais c'est simple qui me ferait gagner beaucoup de temps. Le nombre total de chaînes à remplacer est inférieur à 10. Le nombre total de fichiers à vérifier est de ~ 30.
Voici un exemple décrivant ma situation:
Commande que j'utilise:
sed -f replace.txt < a.txt > b.txt
replace.txt qui contient toutes les chaînes:
s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g
a.txt:
?page=one&
?page=two&
?page=three&
Contenu de b.txt après avoir exécuté ma commande sed:
pageone
pagetwo
pagethree
Ce que je veux que b.txt contienne:
/page/one
/page/two
/page/three
Réponses:
Le moyen le plus simple serait d'utiliser un séparateur différent dans vos lignes de recherche / remplacement, par exemple:
Vous pouvez utiliser n'importe quel caractère comme délimiteur qui ne fait partie d'aucune chaîne. Ou, vous pouvez y échapper avec une barre oblique inverse:
Ce qui remplacerait
/
parfoo
. Vous voudrez utiliser la barre oblique inverse échappée dans les cas où vous ne savez pas quels caractères peuvent apparaître dans les chaînes de remplacement (si ce sont des variables shell, par exemple).la source
sed
que la commande regex est mise entre guillemets. Je ne les ai pas utilisés dans ma réponse parce que je ne montrais pas toute lased
ligne de commande, mais juste lased
chaîne de commande regex comme l'avait fait l'OP. Si vous le mettez dans un fichier, comme l'a fait l'OP, vous n'avez pas besoin des guillemets.sed
commande dans un script shell, des barres obliques inverses supplémentaires peuvent être nécessaires (chaque barre oblique inverse doit être à nouveau annulée).La
s
commande peut utiliser n'importe quel caractère comme délimiteur; quel que soit le caractère qui vient après que les
est utilisé. J'ai été amené à utiliser un#
. Ainsi:la source
Un fait très utile mais moins connu à propos de sed est que la
s/foo/bar/
commande familière peut utiliser n'importe quelle ponctuation, pas seulement des barres obliques. Une alternative courante ests@foo@bar@
, à partir de laquelle il devient évident comment résoudre votre problème.la source
ajouter \ avant les caractères spéciaux:
etc.
la source
s/foo\/bar/foo_bar/
fonctionnera, mais/foo\/bar/foo_bar/
ne le fera pas.Dans un système que je développe, la chaîne à remplacer par sed est le texte d'entrée d'un utilisateur qui est stocké dans une variable et passé à sed.
Comme indiqué précédemment dans cet article, si la chaîne contenue dans le bloc de commande sed contient le délimiteur réel utilisé par sed - alors sed se termine sur une erreur de syntaxe. Prenons l'exemple suivant:
Cela marche:
Cela casse:
Le remplacement du délimiteur par défaut n'est pas une solution robuste dans mon cas car je ne voulais pas empêcher l'utilisateur de saisir des caractères spécifiques utilisés par sed comme délimiteur (par exemple "/").
Cependant, échapper à toutes les occurrences du délimiteur dans la chaîne d'entrée résoudrait le problème. Considérez la solution ci-dessous consistant à échapper systématiquement le caractère délimiteur dans la chaîne d'entrée avant de le faire analyser par sed. Un tel échappement peut être implémenté comme un remplacement en utilisant sed lui-même, ce remplacement est sûr même si la chaîne d'entrée contient le délimiteur - c'est parce que la chaîne d'entrée ne fait pas partie du bloc de commande sed:
J'ai converti ceci en une fonction à utiliser par divers scripts:
la source
VALUE="01\\\/01\\\/2018"
cette ligne devrait fonctionner pour vos 3 exemples:
-r
de sauver quelques évasions.testez avec votre exemple (a.txt):
la source
replace.txt
devrait êtrela source
Excellente réponse d'Anonyme. \ a résolu mon problème lorsque j'ai essayé d'échapper des guillemets dans des chaînes HTML.
Donc, si vous utilisez sed pour renvoyer certains modèles HTML (sur un serveur), utilisez une double barre oblique inverse au lieu d'une simple:
la source
sed
est le s tream ed Itor dans la mesure où vous pouvez utiliser|
(tuyau) pour envoyer des flux standard (STDIN et STDOUT spécifiquement) à traverssed
et de les modifier par programme à la volée, ce qui en fait un outil pratique dans la tradition de la philosophie Unix; mais peut également éditer des fichiers directement en utilisant le-i
paramètre mentionné ci-dessous.Considérez ce qui suit :
s/
est utilisé pour s ubstituer l'expression trouvéefew
avecasd
:/g
signifie "global", ce qui signifie faire cela pour toute la ligne. Si vous désactivez/g
(avecs/few/asd/
, il doit toujours y avoir trois barres obliques quoi qu'il arrive) etfew
apparaît deux fois sur la même ligne, seule la premièrefew
est remplacée parasd
:Ceci est utile dans certaines circonstances, comme la modification des caractères spéciaux au début des lignes (par exemple, en remplaçant les symboles plus grands que certaines personnes utilisent pour citer le matériel précédent dans les fils de discussion par une tabulation horizontale tout en laissant une inégalité algébrique citée plus tard dans la ligne intact), mais dans votre exemple où vous spécifiez que n'importe où,
few
il doit être remplacé, assurez-vous que/g
.Les deux options (indicateurs) suivantes sont combinées en une seule
-ie
:-i
option est utilisée pour modifier i n place sur le fichierhello.txt
.-e
option indique l' e xpression / la commande à exécuter, dans ce cass/
.Remarque: il est important que vous utilisiez
-i -e
pour rechercher / remplacer. Si vous le faites-ie
, vous créez une sauvegarde de chaque fichier avec la lettre «e» ajoutée.la source
Une alternative plus simple consiste à utiliser AWK comme sur cette réponse :
awk '$0="prefix"$0' file > new_file
la source