仅当行号以+ csv文件开头时才替换行

时间:2014-07-22 10:48:27

标签: linux bash perl awk sed

我使用以下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语法,以便仅匹配在","之前开始行的数字。分离器

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

#!/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