web-dev-qa-db-fra.com

Plusieurs remplacements avec une seule commande sed

Je me demande comment je peux faire une recherche/remplacement multiple en utilisant une seule déclaration sed dans Mac OSX. Je peux le faire dans Ubuntu mais en raison de la nature BSD de OSX, la commande doit être légèrement modifiée.

Donc, étant donné un fichier avec la chaîne:

"Red Blue Red Blue Black Blue Red Blue Red"

Je veux exécuter une instruction sed qui se traduit par la sortie:

"Green Yellow Green Yellow Black Yellow Green Yellow Green"

Mes deux instructions sed avec un find éligible

color1="Green"  
color2="Yellow"  
find . -type f -exec sed -i '' s/Red/$color1/g {} \;  
find . -type f -exec sed -i '' s/Blue/$color2/g {} \;  

J'ai essayé plusieurs combinaisons de points-virgules et de barres obliques, et j'ai regardé page de manuel de développement d'Apple pour sed mais avec un manque d'exemples, je n'ai pas pu le reconstituer.

24
user1026361

La page de manuel d'Apple indique plusieurs commandes peuvent être spécifiées en utilisant les options -e ou -f. Donc je dirais

find . -type f -exec sed -i '' -e s/Red/$color1/g -e s/Blue/$color2/g {} \;

Cela fonctionne certainement sous Linux et autres Unices.

24
Lars Brinkhoff

Il devrait également être possible de combiner les commandes sed en utilisant le point-virgule ;:

find . -type f -exec sed -i '' -e "s/Red/$color1/g; s/Blue/$color2/g" {} \;

Je me demandais comment c'était portable et trouvé via cette réponse Stackoverflow un lien vers la spécification POSIX de sed . Surtout si vous avez beaucoup de commandes sed à exécuter, cela me semble moins encombré que d'écrire plusieurs expressions sed.

13
FooF