【问题标题】:Sed's "+" quantifier does not seem to match anythingSed 的“+”量词似乎不匹配任何东西
【发布时间】:2021-06-24 09:54:57
【问题描述】:

我有一个包含以下内容的文件 sedTest.txt:

sdjalsh ABC 123 ashfaladhs
ldjkasf ABC 234 dadas afsf
dafsafs ABC 876 asf dasfaf

我只想输出123234876

我可以使用

cat sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"

我是这样用的,因为通常有 grep 而不是 cat,在这种情况下它可能是

grep ABC sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"

这在这里没有什么意义,但这是日志的典型用法。

我想知道:为什么使用 [0-9]+ 不起作用?我希望得到与 [0-9]* 相同的结果,但似乎没有任何内容被替换(并且打印了未更改的内容)。

【问题讨论】:

    标签: sed


    【解决方案1】:

    + 是一个 ERE 元字符,sed 默认使用 BRE。使用sed -E ... + ...sed ... \+ ... 启用+s ERE 属性,例如

    grep 'ABC' sedTest.txt | sed -E 's/ABC ([0-9]+).*/\1/'
    

    并请注意,当您使用 -E 和领先的 .* 并没有做任何有用的事情时,您不再需要转义括号来启用它们的 ERE 元字符属性,所以我摆脱了它。另外,你不需要 grep+sed,这样就可以了:

    sed -E -n 's/ABC ([0-9]+).*/\1/p' sedTest.txt
    

    但更重要的是你应该真正使用:

    awk '$2=="ABC"{print $3}' sedTest.txt
    

    而是为了清晰、简单、健壮、便携等。

    请始终注意,您应该将脚本(sed、awk、grep 等)用单引号 (') 括起来,而不是双引号 ("),除非您在 shell 决定解释脚本中的某些值时感到意外在您的工具看到它们之前。

    【讨论】:

    • 感谢您澄清这一点。您能否添加一些更详细地描述 ERE/BRE 的链接(或其他内容以供参考)。在您的帖子之后,我在 sed 手册页中注意到了这个首字母缩写词......
    • 不,只是谷歌他们。了解 BRE/ERE 是编写 shell 脚本的基础,为这些脚本添加链接就像添加链接来描述“if”和“then”。
    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多