首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Rgex不按预期使用sed命令

Rgex不按预期使用sed命令
EN

Stack Overflow用户
提问于 2021-10-08 16:19:58
回答 3查看 85关注 0票数 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命令有什么问题,因为它应该能正常工作,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
sed -E '/^[ABCD] ([0-9][0-9]) \1$/d' text.txt

使用带有反向引用的POSIX ERE (\1)引用前面的带括号的模式。

我尝试过这样的命令:

代码语言:javascript
代码运行次数:0
运行
复制
sed -E '/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/d' text.txt

但它似乎只删除了我想要的第一次出现。我想进一步解释一下,

为什么在第二次尝试中第一次出现问题时,反向引用不起作用,如果是的话,我应该包括全局选项吗?既然我已经试着将它添加到expected.

  • what's /d(用于删除)的末尾,但是它没有工作。
EN

回答 3

Stack Overflow用户

发布于 2021-10-08 16:21:40

使用awk要容易得多

代码语言:javascript
代码运行次数:0
运行
复制
awk 'NF == 4' file

A 25 27 50
D 99 88 76

awk命令使用空格或制表符的默认字段分隔符,并检查条件NF == 4,以确保只打印4个字段的行。

对于sed,它将是(假设每行没有leading+trailing空格):

代码语言:javascript
代码运行次数:0
运行
复制
sed -nE '/^[^[:blank:]]+([[:blank:]]+[^[:blank:]]+){3}$/p' file

A 25 27 50
D 99 88 76
票数 4
EN

Stack Overflow用户

发布于 2021-10-08 17:20:46

使用sed程序中显示的示例,您可以尝试如下所示。用GNU sed编写和测试。

代码语言:javascript
代码运行次数:0
运行
复制
sed -nE '/^([^[:space:]]+[[:space:]]+){3}[^[:space:]]+$/p' Input_file

解释:简单地通过sed-n选项停止对行的打印。然后使用-E在程序中使用ERE。在主程序中,使用regex从非空格(1次或更多次)开始匹配,然后是空格(1次或更多次),然后再组合3次(基本上匹配3个字段),然后是非空格1次或更多次,直到行的值结束为止,如果该正则表达式匹配,则打印该行。

票数 3
EN

Stack Overflow用户

发布于 2021-10-08 16:30:13

这可能对您有用(GNU sed):

代码语言:javascript
代码运行次数:0
运行
复制
sed -En 's/\S+/&/4p' file

关闭隐式打印-n和扩展regexp -E

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69498938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档