查找并替换2个字符串之间的字符串

时间:2016-04-28 07:55:35

标签: sed scripting

我已经全神贯注但无法找到sed或其他命令来执行以下操作:

搜索标签之间的内容并用String替换。

<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

3 个答案:

答案 0 :(得分: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

答案 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在代码之间放置新内容

答案 2 :(得分: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>