2016-04-28 21 views
2

我到處都找過,但無法找到一個sed或其他命令執行以下操作之間的替換字符串:發現和2串

搜索什麼標籤之間有替換字符串。

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

聽起來很容易,但無法找到一個同時執行這兩個操作的命令。

我能夠找到並打印值與:

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

但我想替換另一個值的值(1.2.3)。

任何幫助,將不勝感激。

解決 - 和更新,下面使用的變量答案:

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

所以,你知道,你可以捕捉一些文字與'\(... \)'然後引用它以後使用'\ 1'但無法弄清楚如何捕獲'。* '並在以後參考它?只要想一想,你現有的腳本在輸入行的每個部分都在做什麼 - 答案就在那裏。 –

回答

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 
  • 使用\(\)複製的標籤
  • [^<]*下一個關閉標籤
  • \1...\2放置一些新的標籤
  • 之間開始之前匹配一切
+0

我認爲你需要逃避'.'來避免出現' aaa' – slitvinov

+0

這個問題。非常感謝 :) – gary

0

這裏是做

$ 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) 
} 

示例一個簡單的方法:

$ 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 

用法:

awk -f f.awk file.dat 

輸出:

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

使用XML解析器解析XML:例如用

$ 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>