2016-04-28 15 views
2

Ich habe überall gesucht, aber nicht einen Sed oder anderen Befehl, um folgende Aktionen finden:Suchen und Ersetzen String zwischen 2 Strings

Suche nach was zwischen den Tags und ersetzt mit einem String.

<version.of.artifact>1.2.3</version.of.artifact> 

Klingt einfach genug, kann aber keinen Befehl finden, der beides tut.

Ich bin in der Lage und Druckwert zu finden, mit:

sed -n 's:.*<version.of.artifact>\(.*\)</version.of.artifact>.*:\1:p' myFile.txt 

Aber ich mag den Wert (1.2.3) mit einem anderen Wert ersetzen.

Jede Hilfe wäre willkommen.

gelöst - und Antwort unter Verwendung Variablen aktualisiert:

sed -i "s:\(<$var1>\)[^<]*\(</$var1>\):\1$var2\2:" pomtest.xml 
+0

So wissen Sie, dass Sie einen Text mit '\ erfassen kann (... \)' und dann darauf verweisen später mit '\ 1 ' aber kann nicht herausfinden, wie man '. * ' fängt und später darauf Bezug nimmt? Denke einfach darüber nach, was dein bestehendes Skript mit jedem Segment der Eingabezeile macht - die Antworten sind in Ordnung. –

Antwort

0
$ cat myFile.txt 
lkadfkjh<version.of.artifact>aaa</version.of.artifact>lksfdkjh 

$ sed 's:\(<version\.of\.artifact>\)[^<]*\(</version\.of\.artifact>\):\1NewString\2:' myFile.txt 
lkadfkjh<version.of.artifact>NewString</version.of.artifact>lksfdkjh 
  • Mit \( und \) die Tags
  • [^<]* passt alles vor dem Beginn des nächsten schließenden Tag
  • \1...\2 Platzierung etwas Neues zwischen den Tags kopieren
+0

Ich glaube, du musst '.' entkommen, um Probleme mit ' aaa' – slitvinov

+0

zu vermeiden. Danke vielmals :) – gary

0

Hier ist eine einfache Möglichkeit, es

$ cat f.awk 
function init() { 
    tag = "version.of.artifact" 
    b = "<" tag ">" 
    e = "</" tag ">" 

    lb = length(b) 
    le = length(e) 
} 

function upd(old) { 
    return "String" 
} 

function ss(s, a, b) { # substring of `s' from `a' to `b' excluding `b' 
    return substr(s, a, b-a) 
} 

function repl(s, ie, prefix, old, new, ans) { 
    while (ib = index(s, b)) { 
     ie = index(s, e) 
     if (!ie) { 
      print "ERROR: cannot find a closing tag" | "cat 1>&2"; exit 1 
     } 
     prefix = ss(s, 1, ib) # befor the tag 
     old = ss(s, ib + lb, ie) # old value of this tag 
     new = upd(old) 
     ans = ans prefix b new e 
     s = substr(s, ie + le) # after the tag 
    } 
    ans = ans s 
    return ans 
} 

BEGIN { 
    init() 
} 

{ 
    print repl($0) 
} 

Beispiel zu tun:

$ cat file.dat 
text1 
ab<version.of.artifact>1.2.3</version.of.artifact>cd<version.of.artifact>{1.2.3}</version.of.artifact>ef 
<version.of.artifact>1.2.3</version.of.artifact> 
text2 

Verbrauch:

awk -f f.awk file.dat 

Ausgang:

text1 
ab<version.of.artifact>String</version.of.artifact>cd<version.of.artifact>String</version.of.artifact>ef 
<version.of.artifact>String</version.of.artifact> 
text2 
0

einen XML-Parser verwenden XML zu analysieren: zum Beispiel mit

$ cat file.xml 
<version.of.artifact>1.2.3</version.of.artifact> 

$ xmlstarlet ed --inplace --update '//version.of.artifact' --value "4.5.6.7" file.xml 

$ cat file.xml 
<?xml version="1.0"?> 
<version.of.artifact>4.5.6.7</version.of.artifact>