Unix子字符串替换文件

时间:2018-05-15 18:55:31

标签: regex sed

我的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

欣赏有关如何解决这个问题的意见?

2 个答案:

答案 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'