我有一个包含:
的文本文件A 25 27 50
B 35 75
C 75 78
D 99 88 76
我想删除没有第四个字段(第四对数字)的行。期望输出:
A 25 27 50
D 99 88 76
我知道awk命令将是此类任务的最佳选择,但我想知道我的sed有什么问题命令,因为它应该工作,你可以看到如下:
sed -E '/^[ABCD] ([0-9][0-9]) 1$/d' text.txt
使用带反向引用(1)的POSIX ERE来引用前面用圆括号括起来的模式。
我已经尝试了这个命令:
sed -E '/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/d' text.txt
但似乎删除只有第一次出现的我想要的。请进一步解释
- 为什么反向引用不能正常工作
- 第二次尝试中第一次出现的问题是什么,我应该包括全局选项,如果是,那么如何,因为我已经尝试在末尾添加它与/d(用于删除),但没有工作。
使用awk
更容易:
awk 'NF == 4' file
A 25 27 50
D 99 88 76
这个awk
命令使用默认的空格或制表符字段分隔符,并检查条件NF == 4
以确保我们只打印4个字段的行。
对于sed
,它将是(假设每行没有前后空格):
sed -nE '/^[^[:blank:]]+([[:blank:]]+[^[:blank:]]+){3}$/p' file
A 25 27 50
D 99 88 76
使用sed
程序中显示的示例,您可以尝试以下操作:在GNUsed
下编写和测试。
sed -nE '/^([^[:space:]]+[[:space:]]+){3}[^[:space:]]+$/p' Input_file
解释:通过sed
的-n
选项简单地停止打印行。然后使用-E
在程序中使用ERE。在主程序中,使用regex从非空格(1次或多次出现)开始匹配,然后是空格(1次或多次出现)和这个组合3次(基本上匹配3个字段),然后是非空格1次或多次出现,直到行值结束,如果这个regex匹配,则打印该行。
这可能适合您(GNU sed):
sed -En 's/S+/&/4p' file
关闭隐式印刷-n
扩展regexp-E
。
将第4个字段替换为其本身并打印结果。