【问题标题】:sed substitute each character until a pattern occurssed 替换每个字符,直到出现模式
【发布时间】:2017-03-20 23:27:31
【问题描述】:

我有一个由数字和逗号组成的模式,例如: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 '停止'而不是替换空格和/或字母之后出现的任何数字?

【问题讨论】:

  • mypattern:kkk,kkk,k,k pattern_i_don't_need:1499,242,22,1 总是在同一行?还是可以在不同的行中?
  • 是的,它总是在同一行;开头总是mypattern,前面没有任何字符,然后是我需要用'k's替换的数字,然后是一些空格和字母(它们的数量不固定,每行可能不同),然后是更多不需要更改的带逗号的数字;这是一行。

标签: regex bash sed


【解决方案1】:

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

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

    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
    

【讨论】:

  • 注意可以去掉测试/mypattern:/
  • @CasimiretHippolyte 你说得对,s 中的 mypattern 就足够了。我简化了答案,谢谢。
【解决方案2】:

您可以使用 awk 来:

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

同样的概念只是 awk 让您可以选择处理由空格分隔的第一列数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2017-12-17
    相关资源
    最近更新 更多