web-dev-qa-db-fra.com

Comment utiliser SED pour rechercher et remplacer des chaînes d'URL par le caractère "/" dans les chaînes ciblées?

J'essaie d'utiliser SED via OS X Terminal pour effectuer une recherche et un remplacement.

Imaginez que j'ai cette chaîne jonchée tout au long du fichier texte: http://www.find.com/page

Et je veux le remplacer par cette chaîne: http://www.replace.com/page

J'ai des problèmes parce que je ne sais pas comment m'échapper correctement ou utiliser le caractère "/" dans mes chaînes. Par exemple, si je voulais simplement trouver "chat" et remplacer par "chien", j'ai trouvé la commande suivante qui fonctionne parfaitement:

sed -i '' 's/cat/dog/g' file.txt

Quelqu'un at-il des idées sur la façon de réaliser la même fonctionnalité uniquement au lieu que chat et chien aient des chaînes ou des URL qui contiennent le caractère "/"? J'ai essayé de nombreuses façons différentes d'échapper aux caractères "/", mais il semble que SED ne puisse plus "trouver" la chaîne et qu'il n'effectue aucune action de recherche et remplacement.

Toute aide ou conseil est grandement apprécié.

Merci!

41
LearnWebCode

/ n'est pas le délimiteur dans les commandes sed, c'est juste l'une des possibles. Pour cet exemple, vous pouvez par exemple utiliser , à la place, car il n'entre pas en conflit avec vos chaînes;

echo 'I think http://www.find.com/page is my favorite' | 
    sed 's,http://www.find.com/page,http://www.replace.com/page,g'
114
Joachim Isaksson

sed peut prendre ce qui suit le "s" comme séparateur. Comme vous travaillez avec URL, il est recommandé d'utiliser un délimiteur différent de / pour ne pas confondre sed lorsque votre substitution se termine et que le remplacement commence.

Cela dit, vous pouvez certainement utiliser / si vous le souhaitez aussi. Vous avez juste besoin d'échapper au littéral /.

Vous pouvez donc:

sed 's/http:\/\/www.find.com\/page/http:\/\/www.replace.com\/page/g' input_file

ou utilisez un délimiteur différent pour éviter de rendre votre sed cryptique plus cryptique.

sed 's#http://www.find.com/page#http://www.replace.com/page#g' input_file
30
jaypal singh