我想检查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
答案 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开头的数字匹配。gsub
将I
替换为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