sed替换每个字符直到模式发生

时间:2017-03-20 12:51:28

标签: regex bash sed

我有一个由数字和逗号组成的模式,如下所示:123,45,2,14324。可以有任意数量的数字,我无法知道两个逗号之间有多少位数。我需要用字母' k'替换每个数字,因此129,54,0,111变为kkk,kk,k,kkk。我只需要在它之前出现某种模式时替换它,并且它总是出现在这样的一行: mypattern:123,421,9,3 pattern_i_don't_need:1499,242,22,1

我需要替换mypattern:后面的每个数字,因此示例行需要更改为:

mypattern:kkk,kkk,k,k pattern_i_don't_need:1499,242,22,1

我只能使用sed和/或grep。 到目前为止,我已经学会了如何替换相关行中的每个字符,如下所示:

   sed '/^mypattern:/ s/[0-9]/k/g' 

此版本找到以mypattern:开头的行,并替换该行上的每个数字。我怎么能告诉sed停止'并且不能替换空格和/或字母后出现的任何数字?

2 个答案:

答案 0 :(得分:3)

您可以使用这样的sed命令:

sed -r ':a s/(mypattern:[k,]*)[0-9]/\1k/; t a' yourfile
  • :at as进行替换时跳转到的标签
  • 因此你有一个"循环":

    while s has replaced one digit with a "k":
        try again to: 
            replace another digit after 
                 "mypattern:" and an optional sequence of "k" and comma:
            with k
    

答案 1 :(得分:0)

您可以使用awk:

awk '/^mypattern/ && gsub(/[0-9]/,"k",$1)' file

同样的概念只是awk为您提供了处理由空格分隔的第一列数据的选项。