我的abc.txt
文件包含以下条目。我想用第二个冒号(:)之后用给定值替换以"test"
开头的句子的子串。
尝试如下:
echo test:abc.io/gng-cp:1.34.2-of1231 | sed 's/\([^test:]*:\).*/\11.333.555/g'
但它正在给予:
test:1.333.555
预期是:
test:abc.io/gng-cp:1.333.555
输入是:
abc.txt
=======
jnu
mango
vim
test:abc.io/gng-cp:1.34.2-of1231
欣赏有关如何解决这个问题的意见?
答案 0 :(得分:1)
表达式[^test:]*
表示:匹配零个或多个不在集合{t, e, s, t, :}
中的字符,这可能不是您想要的。您将全局/g
修饰符传递给表达式,即使您只修改了一次字符串。此外,还不清楚您在何处捕获字符串的abc.io/gng-cp
部分以保留它。
试试这个:
sed 's/^\(test:[^:]*:\).*$/\11.333.555/' abc.txt
这将匹配以test:
开头的字符串并保留它和两个冒号之间的所有内容,用新的数字字符串替换第二个冒号之后的所有内容。
答案 1 :(得分:0)
关注awk
也可以为您提供帮助。
echo "test:abc.io/gng-cp:1.34.2-of1231" | awk -v val="1.333.555" 'match($0,/:[^:]*/){print substr($0,1,RSTART+RLENGTH) val;next} 1' Input_file
现在添加非单线形式的解决方案。
echo "test:abc.io/gng-cp:1.34.2-of1231" | awk -v val="1.333.555" '
match($0,/:[^:]*/){
print substr($0,1,RSTART+RLENGTH) val;
next}
1'