2016-12-25 1 views
0

Ich habe versucht, eine sed ersetzen zu tun. Aus irgendeinem Grund kann ich meinen Kopf sed und regulären Ausdrücken nicht nur um (das ist meine zweite sed Frage)Suchen ersetzen Zeichenfolge vor und nach

Grundsätzlich ich Text finden wollen und ersetzen Sie dann das nächste Auftreten eines Textes finden und ersetzen Sie dass

Bisher habe ich diese

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

Das gibt:

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

Allerdings möchte ich zurückkehren

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

Dies wäre der Ersatz} mit + "

Die Logik wäre so etwas wie:

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

Das zweite Bit wäre direkt nach der Zeichenfolge zu ersetzen, enthält: hcvar-

Dies sollte für die folgenden String-Beispiele arbeiten

  • Dies könnte überall sein und dieses Bit sollte \ $ {hcvar-Bookname} geändert werden und dies würde bleiben
  • Dies könnte überall und dieses Bit sein sollte \ $ {hcvar-somethingelse} geändert werden und dies würde bleiben
  • Dies könnte überall sein und dieses Bit sollte
    \ $ {hcvar-wouldnevercontainspaces} geändert werden und dies würde

Jede Hilfe würde geschätzt bleiben.

Antwort

0

Sie benötigen $ mit einem Backslash zu entkommen:

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/\\}/ +/'

Ausgang:

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

+0

In POSIX sed '$' ist literal, wenn es nicht das letzte Zeichen im "Muster" -Teil des Ersatzbefehls ist. In vielen Varianten ist '$' jedoch kein Literal, wenn es das letzte logische Zeichen ist, dh: 's/\ (a \ | $ \)/b /' ersetzt 'a' oder das Nullbyte nach dem Musterraum mit' b'. – andlrc

1

Unter der Annahme, dass Ihre Eingabe ist eigentlich:

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

Dann wurde die folgende wird funktionieren:

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

Hinweis Benutzen Sie zu bewahren, was sonst Sonderzeichen für die Shell würde:

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

Wenn die Eingabe nicht verwendet tatsächlich \{ i.e: ... $\{hello\} ..., arbeiten dann könnte dies:

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

Aufteilung:

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 

die g lobaler hinzufügen, wenn Sie Substitutionen pro Zeile multiplizieren müssen:

s/pattern/replacement/g 
#     ^Global flag 
Verwandte Themen