【问题标题】:Replacing text between n-th and (n+1)-th delimiter using sed使用 sed 替换第 n 和第 (n+1) 分隔符之间的文本
【发布时间】:2017-09-25 14:00:25
【问题描述】:

我想知道如何更改管道分隔数据集中特定位置的单个值。

例如,我有数据集:

01|456|AAAA|James Bond|AAAA|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|AAAA|6296903
04|3213|AAAA|AAAA|BBBB|62969

我想将每个“AAAA”值更改为“XXXX”,但仅限于第 4 和第 5 个管道字符 (|) 之间。因此,预期的输出将如下所示:

01|456|AAAA|James Bond|XXXX|207085
02|AAAA|BBBB|Marco Polo|BBBB|937311723
03|321332|BBBB|Brad Pitt|XXXX|6296903
04|3213|AAAA|AAAA|BBBB|62969

仅使用sed 函数是否可以实现,还是必须使用awk 之类的函数。

【问题讨论】:

    标签: regex bash unix sed


    【解决方案1】:

    设置输入字段分隔符(FS)、输出字段分隔符(OFS),如果第 5 列包含 AAAA,则替换为 XXXX

    awk 'BEGIN{FS=OFS="|"} $5=="AAAA" {$5="XXXX"}1' file
    

    输出:

    01|456|AAAA|詹姆斯邦德|XXXX|207085 02|AAAA|BBBB|马可波罗|BBBB|937311723 03|321332|BBBB|布拉德皮特|XXXX|6296903 04|3213|AAAA|AAAA|BBBB|62969

    【讨论】:

      【解决方案2】:

      最好使用awk

      awk 'BEGIN{FS=OFS="|"} {gsub(/A/, "X", $5)} 1' file
      
      01|456|AAAA|James Bond|XXXX|207085
      02|AAAA|BBBB|Marco Polo|BBBB|937311723
      03|321332|BBBB|Brad Pitt|XXXX|6296903
      04|3213|AAAA|AAAA|BBBB|62969
      
      • BEGIN{FS=OFS="|"} 使用管道作为输入和输出字段分隔符
      • gsub(/A/, "X", $5) 仅在第 5 列将 $5 中的每个 A 替换为 X
      • 1 是打印每一行的默认操作

      【讨论】:

        【解决方案3】:
        awk -v start=4 -v end=5 'BEGIN{FS=OFS="|"}{for(i=start;i<=end;i++) gsub(/AAAA/,"XXXX",$i)}1' inputfile
        01|456|AAAA|James Bond|XXXX|207085
        02|AAAA|BBBB|Marco Polo|BBBB|937311723
        03|321332|BBBB|Brad Pitt|XXXX|6296903
        04|3213|AAAA|XXXX|BBBB|62969
        

        基于startend 变量的值,gensub 函数将在这些值之间的列之间进行替换。

        【讨论】:

          【解决方案4】:

          这可能对你有用(GNU sed):

          sed -r ':a;s/^(([^|]*\|){4}X*)[^X|]/\1X/;ta' file
          

          迭代,将不是X| 的所有字符从第四个| 字符替换为X

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-18
            • 2012-04-07
            相关资源
            最近更新 更多