在CSV中的列中搜索模式,并使用sed命令替换同一行中的另一个模式

时间:2015-04-09 02:14:21

标签: linux shell sed command

我想检查CSV文件中第二列中的模式(仅当模式以...开头),如果该模式存在,则替换同一行中的其他内容。

如果第二列中存在模式676,我编写了以下sed命令,用于跟随csv将I更改为N.但它也检查了第7和第9列中的676,因为676存在。理想情况下,如果前缀676存在,我只想检查第二行。我想要的是在第二列中检查676前缀(模式不在第二个值Ex- 46769777的中间或末尾),然后对I,to,N进行更改。

sed -i  '/,676/ {; s/,I,/,N,/;}' temp.csc

6768880,55999777,S,I,TTTT,I,67677,yy
6768880,676999777,S,I,TTTT,I,67677,yy 
6768880,46769777,S,I,TTTT,I,67677,yy  

需要预期结果

6768880,55999777,S,I,TTTT,I,67677,yy
6768880,676999777,S,N,TTTT,N,67677,yy
6768880,40999777,S,I,TTTT,I,67677,yy  

2 个答案:

答案 0 :(得分:2)

这要求在进行任何更改之前,676出现在第二列的开头:

$ sed   '/^[^,]*,676/ s/,I,/,N,/g' file
6768880,55999777,S,I,TTTT,I,67677,yy
6768880,676999777,S,N,TTTT,N,67677,yy 
6768880,46769777,S,I,TTTT,I,67677,yy  

注意:

  • 正则表达式/^[^,]*,676/要求在第一次出现逗号后出现676。更详细:

    • ^匹配行的开头

    • [^,]*与第一列匹配

    • ,676匹配第一个逗号后跟676

  • 在您想要的输出中,,I,每次出现在行上时都会被,N,替换。为实现此目的,g(意为全局)已添加到替换命令中。

答案 1 :(得分:2)

如果您不受sed约束,awk对您来说可能是更好的选择。试一试:

awk -F"," '{match($2,/^676/)&&gsub(",I",",N")}{print}' temp.csc

match语法将第二列与以(^)676开头的数字匹配。gsubI替换为N

结果: 6768880,55999777,S,I,TTTT,I,67677,yy 6768880,676999777,S,N,TTTT,N,67677,yy 6768880,46769777,S,I,TTTT,I,67677,yy