2017-10-18 13 views
0

Problème: J'ai une variable avec des personnages que je voudrais préfixer un autre caractère à l'intérieur de la même chaîne stockée dans uneRechercher et remplacer les caractères spécifiques dans une variable avec sed

variables

Ex. "[Blahblahblah]" ---> "\ [blahblahblah \]"

Solution actuelle: Actuellement, j'accomplir ce que je veux avec deux étapes, chaque étape attaquer un support

Ex.

temp=[blahblahblah] 
firstEscaped=$(echo $temp | sed s#'\['#'\\['#g) 
fullyEscaped=$(echo $firstEscaped | sed s#'\]'#'\\]'#g) 

Cela me donne le résultat que je veux, mais je sens que je peux accomplir cela en une ligne en utilisant capturing groups. Je n'ai tout simplement pas eu de chance et je me brûle. La plupart des exemples que je rencontre impliquent de vouloir extraire le texte entre crochets au lieu de ce que j'essaie de faire. This est ma dernière tentative en vain. Des idées?

Répondre

3

Il peut y avoir des moyens efficaces, (seulement 1 s/s/r/ avec un colombophile reg-ex), mais cela fonctionne, compte tenu de votre entrée exemple

fully=$(echo "$temp" | sed 's/\([[]\)/\\\1/;s/\([]]\)/\\\1/') ; echo "$fully" 

sortie

\[blahblahblah\] 

Notez que Il est tout à fait possible d'enchaîner plusieurs opérations sed, séparées par ; OU si dans un fichier de script sed, par des lignes vides.

Lisez à propos de sed des groupes de capture en utilisant \(...\) paires, et en les référençant par numéro, c'est-à-dire \1.

IHTH

2
$ temp=[blahblahblah]  
$ fully=$(echo "$temp" |sed 's/\[\|\]/\\&/g'); echo "$fully" 
\[blahblahblah\] 

Brève explication,

  • \[\|\]: objectif de remplacer '[' ou ']', et '[', ']', et '|' besoin d'être échappé.
  • &: le caractère & pour faire référence au modèle qui correspondait, et pense qu'il doit également être échappé.

Comme la suggestion de @Gordon Davisson, vous pouvez également utiliser l'expression de support pour éviter le format étendu regex,

sed 's/[][]/\\&/g' 
+1

Vous devez guillemet 'temp' $ pour empêcher la séparation de mots et de l'expansion générique. Notez que '[]' est un caractère générique de shell, il peut donc se développer de façon inattendue. –

+0

Oui, vous avez raison. Ceci est copié de l'OP, et va le modifier. – CWLiu

+1

Je viens aussi de remarquer que l'expression régulière que vous utilisez est au format étendu (en utilisant '|' pour séparer les alternatives). Cela ne fonctionnera généralement pas, sauf si vous utilisez 'sed -r' (GNU sed) ou' sed -E' (BSD sed). Il serait probablement préférable d'utiliser une expression entre parenthèses (bien qu'une expression entre parenthèses contenant des crochets soit ... difficile). 'sed 's/[] []/\\ &/g'' devrait fonctionner. –