![如果第 n 个字符不是特定字符,sed 删除行](https://linux22.com/image/85774/%E5%A6%82%E6%9E%9C%E7%AC%AC%20n%20%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%8D%E6%98%AF%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%EF%BC%8Csed%20%E5%88%A0%E9%99%A4%E8%A1%8C.png)
我有一个 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 个字段中的任何一个比您预期的长(或短),则它不会失败。作为一般规则,如果您的数据是字段分隔的,那么使用字段比使用字符位置更好。