2016-12-25 1 views
0

J'ai essayé de faire un remplacement de sed. Pour une raison quelconque, je ne peux pas ma tête sed et des expressions régulières (ce qui est ma deuxième question sed)Trouver la chaîne de remplacement avant et après

Fondamentalement, je veux trouver du texte et de le remplacer, puis trouver l'occurrence suivante du texte et le remplacer

jusqu'à présent, j'ai ce

echo "This could be anywhere and this bit should be changed \$\{hcvar-BookName\} and this would remain" | sed 's/$\\{hcvar-/" + hcvar-/g' 

ce retour:

*This could be anywhere and this bit should be changed " + hcvar-BookName\} and this would remain* 

Cependant, je veux revenir

*This could be anywhere and this bit should be changed " + hcvar-BookName + " and this would remain* 

Cela remplacerait le} avec + "

La logique serait quelque chose comme:

Find: \$\{hcvar- 
Replace with: " + hcvar- 
Then find the next occurrence of: \} 
Replace with: + " 

Le second bit pour remplacer serait juste après la chaîne qui contient: hcvar-

Cela devrait fonctionner pour les exemples de chaînes suivants

  • Cela pourrait être partout et ce bit doit être changé \ $ {hcvar-bookname} et cela resterait
  • Cela pourrait être partout et ce bit doit être modifié \ $ {hcvar-somethingelse} et ceci restera
  • cela pourrait être partout et ce bit doit être changé
    \ $ {hcvar-wouldnevercontainspaces} et cela resterait

Toute aide serait appréciée.

Répondre

0

Vous devez échapper à $ avec une barre oblique inverse:

echo "This could be anywhere and this bit should be changed \$\{hcvar-BookName\} and this would remain" | sed -e 's/\$\\{hcvar-/" + hcvar-/g' -e 's/\\}/ +/'

Sortie:

This could be anywhere and this bit should be changed " + hcvar-BookName + and this would remain

+0

Dans Posix sed '$' est littéral si ce n'est pas le dernier caractère de la partie 'pattern' de la commande de substitution. Dans beaucoup de variantes, $ ne sera pas littéral s'il s'agit du dernier caractère logique, c'est-à-dire: 's/\ (a \ | $ \)/b /' remplacera 'a' ou l'octet nul après l'espace de motif' b'. – andlrc

1

En supposant que votre entrée est en fait:

... changed ${hcvar-BookName} and ... 

Puis les suivantes fonctionnera:

$ sed 's/${\([^}]*\)}/" + \1 + "/' file.txt 
This could be anywhere and this bit should be changed " + hcvar-BookName + " and this would remain 

utilisation Note des guillemets simples pour préserver ce qui serait autrement des caractères spéciaux du shell:

$ echo '...changed ${hcvar-BookName} and ...' | sed '...' 

Si l'entrée est en fait n'utilise \{ i.e: ... $\{hello\} ..., cela pourrait fonctionner:

$ sed 's/$\\{\([^}]*\)\\}/" + \1 + "/' file.txt 
This could be anywhere and this bit should be changed " + hcvar-BookName + " and this would remain 

Répartition:

s/   /  /# Replace ... with ... 
    ${   }    # Literal ${ and literal } 
    \( \)    # \(and \) is a capturing group 
     [^}]*    # Match everything but } zero or more times 
       " + \1 + " # \1 will be expanded to the captured result 
          # from \(, \). The rest is literal 

Ajouter le g MONDIALES si vous avez besoin de multiplier les substitutions sur chaque ligne:

s/pattern/replacement/g 
#     ^Global flag