我已经全神贯注但无法找到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
答案 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:例如使用xmlstarlet
$ 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>