【问题标题】:replace word in line only if line number start with + csv file仅当行号以 + csv 文件开头时才替换行中的单词
【发布时间】:2014-09-13 03:37:38
【问题描述】:

我使用以下 sed 命令来替换 CSV 行中的字符串

(替换字符串的条件是匹配CSV文件开头的数字)

SERIAL_NUM=1


sed "/$SERIAL_NUM/ s//OK/g" file.csv

问题是我只想匹配从行首开始的数字,

但 sed 匹配具有此编号的其他行

示例:

在此示例中,我想将单词 - STATUS 替换为 OK,但仅在以 1 开头的行中(在“,”分隔符之前)

所以我这样做

 SERIAL_NUM=1


 more file.csv


 1,14556,43634,266,242,def,45,STATUS
 2,4345,1,43,57,24,657,SD,STATUS
 3,1,WQ,435,676,90,3,44f,STATUS


 sed -i "/$SERIAL_NUM/ s/STATUS/OK/g" file.csv


 more file.csv

 1,14556,43634,266,242,def,45,OK
 2,4345,1,43,57,24,657,SD,OK
 3,1,WQ,435,676,90,3,44f,OK

但 sed 也将第 2 行和第 3 行中的 STATUS 替换为 OK(因为这些行的编号为 1)

请告知如何更改 sed 语法,以便仅匹配 "," 分隔符之前开始行的数字

remark - 解决方案也可以使用 perl line liner 或 awk,

【问题讨论】:

    标签: linux bash perl awk sed


    【解决方案1】:

    您可以使用锚点^ 确保$SERIAL_NUM 仅在开始时匹配,然后使用, 确保此数字后面有一个逗号:

    sed "/^$SERIAL_NUM,/s/STATUS/OK/g" file.csv
    

    【讨论】:

    • 有一个BUG,如果行以12开头并且我们要更改以1开头的行,它也会发生变化
    • 我会问这个新问题
    • 您可以使用:sed "/^$SERIAL_NUM,/s/STATUS/OK/g" file.csv
    【解决方案2】:

    由于这个答案在Stackoverflow perl report 中排名第五,但没有 perl 内容,我认为添加以下内容会很有用 - 而不是删除 perl 标签 :-)

    #!/usr/bin/env perl
    use strict;
    use warnings; 
    
    while(<DATA>){
      s/STATUS/OK/g if /^1\,/;
      print ;
    }
    
    __DATA__
    1,14556,43634,266,242,def,45,STATUS
    2,4345,1,43,57,24,657,SD,STATUS
    3,1,WQ,435,676,90,3,44f,STATUS
    

    或一行:

    perl -ne 's/STATUS/OK/g if /^1\,/;' file.csv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2019-10-28
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      相关资源
      最近更新 更多