正则表达式在使用sed命令时无法正常工作

4
我有一个文本文件,里面包含以下内容:

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

使用支持back-referencing (\1)的POSIX ERE引用前面用括号包围的模式。

我尝试了以下命令:

sed -E '/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/d' text.txt

但它似乎只删除了我想要的第一个出现的内容。

  • 为什么反向引用不按预期工作?
  • 第二次尝试中第一次出现的问题是什么,如果需要包含全局选项,那么应该如何添加?已经尝试在结尾处与/d(用于删除)一起添加了全局选项,但没有起作用。
3个回答

4
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

@Ayoub_Prog:这个行得通吗? - anubhava

3

通过你展示的sed程序样本,你可以尝试以下操作。本文在GNU sed下编写并测试。

sed -nE '/^([^[:space:]]+[[:space:]]+){3}[^[:space:]]+$/p' Input_file

说明: 通过使用sed-n选项简单地停止行的打印。然后在程序中使用-E来使用ERE。在主程序中,使用正则表达式匹配从开始的非空格符(1个或多个出现)后跟空格符(1个或多个出现)和此组合3次(基本上是匹配3个字段),其后跟非空格符1个或多个出现直到行的值末尾,如果此正则表达式匹配,则打印该行。


2
这可能对您有用(GNU sed):
sed -En 's/\S+/&/4p' file

关闭隐式打印-n并开启扩展正则表达式-E

用自身替换第四个字段并打印结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接