加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

任何人都可以解释“sed-regex here”中发生的事情

发布时间:2020-12-14 01:28:51 所属栏目:Linux 来源:网络整理
导读:我正在使用正则表达式练习sed命令,但结果并不像预期的那样.我在mac Sierra上使用终端. 这是输入数据: Mark watermellons 12Robert pears 4Terry oranges 9Lisa peaches 7Susy oranges 12Mark grapes 39Anne mangoes 7Greg pineapples 3Oliver rockmellons 2
我正在使用正则表达式练习sed命令,但结果并不像预期的那样.我在mac Sierra上使用终端.
这是输入数据:

Mark watermellons 12
Robert pears 4
Terry oranges 9
Lisa peaches 7
Susy oranges 12
Mark grapes 39
Anne mangoes 7
Greg pineapples 3
Oliver rockmellons 2
Betty limes 14

我正在尝试交换第一列和第二列.我使用了这个命令:

sed 's/(.+) (.+) /2 1/ ' file.txt

此命令返回相同的输入.但是当我使用时,

sed 's/(.*) (.*) /2 1 /' file.txt

列正在交换.为什么“”不匹配,因为每行至少有一个字符.

也,
我用的时候

sed 's/(.*) (.*)/2 1 /' file.txt

第一个括号是捕获前两列,第二个是最后一列,为什么第一个括号没有捕获第一列?

解决方法

问题不在于你对正则表达式和贪婪匹配等方面的理解.问题只是在问题中的示例使用中没有实现.

在sed中,默认情况下,并不意味着“一个或多个前一个符号”,因为您可能会使用其他正则表达式语法.
为了使这个工作在BSD sed(就像你在OSX上),
你需要使用-E启用扩展正则表达式,
并且还更改捕获组语法:

sed -E 's/(.+) (.+) /2 1/ ' file.txt

还要注意,这基本上只是一个捷径,
所以你总是可以用老式的方式写它:

sed 's/(..*) (..*) /2 1/' file.txt

顺便说一句,总是要注意BSD sed和GNU sed之间的区别.
例如,这在GNU sed中可以正常工作,但在BSD sed中没有:

sed 's/(.+) (.+) /2 1/ ' file.txt

这篇文章的前两个解决方案在GNU和BSD sed中都有效.只要有可能,最好选择适合两者的语法,防止各种调试地狱.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读