我有一个文本文件,其中包括:
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
使用带有反向引用的POSIX ERE (\1)引用前面的带括号的模式。
我尝试过这样的命令:
sed -E '/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/d' text.txt
但它似乎只删除了我想要的第一次出现。我想进一步解释一下,
为什么在第二次尝试中第一次出现问题时,反向引用不起作用,如果是的话,我应该包括全局选项吗?既然我已经试着将它添加到expected.
发布于 2021-10-08 08:21:40
使用awk
要容易得多
awk 'NF == 4' file
A 25 27 50
D 99 88 76
此awk
命令使用空格或制表符的默认字段分隔符,并检查条件NF == 4
,以确保只打印4个字段的行。
对于sed
,它将是(假设每行没有leading+trailing空格):
sed -nE '/^[^[:blank:]]+([[:blank:]]+[^[:blank:]]+){3}$/p' file
A 25 27 50
D 99 88 76
发布于 2021-10-08 09:20:46
使用sed
程序中显示的示例,您可以尝试如下所示。用GNU sed
编写和测试。
sed -nE '/^([^[:space:]]+[[:space:]]+){3}[^[:space:]]+$/p' Input_file
解释:简单地通过sed
的-n
选项停止对行的打印。然后使用-E
在程序中使用ERE。在主程序中,使用regex从非空格(1次或更多次)开始匹配,然后是空格(1次或更多次),然后再组合3次(基本上匹配3个字段),然后是非空格1次或更多次,直到行的值结束为止,如果该正则表达式匹配,则打印该行。
发布于 2021-10-08 08:30:13
这可能对您有用(GNU sed):
sed -En 's/\S+/&/4p' file
关闭隐式打印-n
和扩展regexp -E
。
用自身替换第四个字段并打印结果。
https://stackoverflow.com/questions/69498938
复制