我想检查CSV文件第二列中的模式(仅当模式以开头时),如果该模式存在,则替换同一行中的其他模式。
如果第二列中存在模式676,我为下面的csv编写了以下sed命令,将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
如果您不受sed
的约束,awk
可能是更好的选择。试试看:
awk -F"," '{match($2,/^676/)&&gsub(",I",",N")}{print}' temp.csc
match
语法将第二列与以(^
)676开头的数字进行匹配。CCD_ 5用CCD_ 7代替CCD_。
结果:
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
出现在第二列的开头:
$ 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
(表示全局)。