如果第 n 个字符不是特定字符,sed 删除行

如果第 n 个字符不是特定字符,sed 删除行

我有一个 csv 文件,如果第 12 个字符不是 ,我想删除行;

例如,我的文件如下所示:

2266308;A;B;dfsgsfdg    
2266309;A;BJHSADFK;gfsdg
2266310;A;B;dfg

而且我要:

2266308;A;B;dfsgsfdg
2266310;A;B;dfg

如果其中第 12 个字符不是 sed 的,如何删除该行;? =)

答案1

要删除第 12 个字符不是 的所有行;,您可以执行以下操作:

 $ sed -E '/^.{11}[^;]/d' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

或者,编辑原始文件(如果您sed支持-i):

$ sed -iE '/^.{11}[^;]/d' file

如果你sed不支持-E

sed -i '/^.\{11\}[^;]/d' file

但是,由于这是一个 csv 文件,因此使用字段而不是字符计数要安全得多。例如,使用awk并告诉它打印第三个字段为一个字符长的所有行:

$ awk -F';' 'length($3)==1' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

使用最新的 GNU awk,您可以就地编辑文件:

 awk -iinplace -F';' 'length($3)==1' file

这样做的优点是对前面字段的长度变化具有鲁棒性。与该sed方法不同的是,如果行上有前导空格或者前 2 个字段中的任何一个比您预期的长(或短),则它不会失败。作为一般规则,如果您的数据是字段分隔的,那么使用字段比使用字符位置更好。

相关内容