2017-05-13 2 views
2

Je souhaite utiliser sed pour remplacer chaque occurrence d'un texte particulier dans une arborescence de fichiers source complète. J'ai essayé ce qui suit: $ grep -rlI name2port\(\"Wan1\"\) . --exclude-dir=.svn --exclude=*.vxs | xargs sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g' mais cela ne semble pas fonctionner, je pense que mon cmd sed n'est pas correct.
Comment est-ce que je fais ceci?remplacer récursivement le texte par sed

Le problème est que les remplacements ne se produisent tout simplement pas.

J'ai essayé ceci: $ sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c mais s'avère, les occurrences de name2port("Wan1") ne seraient pas remplacées.

Répondre

3

sed utilise BREs (de base expressions régulières) par défaut, qui, pour des raisons historiques - et de façon surprenante pour ceux qui sont habitués à des expressions régulières modernes - nécessitent échapper de certains métacaractères afin d'être reconnu comme tel.

En Brès ( et ) sont ordinaires (littérale) caractères, et ne deviennent spécial quand \ encodée.

Par conséquent, pour correspondre littéral name2port("Wan1"), utilisez-littéral-est dans un BRE (étant donné que vous pouvez aussi ne pas besoin d'instances \" caractères d'échappement):

sed -i 's/name2port("Wan1")/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c 

Si vous n'êtes pas préoccupé par la portabilité, vous pouvez utiliser -r (ou -E pour portabilité limitée à Mac OS, mais avec -i ça ne marchera pas), ce qui permet alors ERE (étendu expressions régulières), dont la syntaxe et caractéristiques sont plus susceptibles de travailler comme prévu:

sed -r -i 's/name2port\("Wan1"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c 

Notez comment littéraux ( et ) maintenant font besoin d'être \ encodée, de peur qu'ils ne soient interprétées comme enfermant un groupe de capture.

Dans ce cas particulier, c'est le BRE qui nécessite moins d'échappement que l'ERE; en général, cependant, c'est le contraire.