Rgex 无法按预期使用 sed 命令



我有一个包含:

的文本文件

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个字段替换为其本身并打印结果。

相关内容

  • 没有找到相关文章

最新更新