【问题标题】:Bash sed to find lines where the last word contains letterBash sed 查找最后一个单词包含字母的行
【发布时间】:2026-01-26 01:35:01
【问题描述】:

仅使用 sed,我试图打印文件中最后一个单词包含字母“d”的行。 内容可能类似于:

Honey, I am leaving for grocery shopping. Do you want anything?
Are you well? You look exhausted.

之后只会打印第二行。

我试过sed -En '/\s*([\S]+)\b[a-zA-Z]*d[a-zA-Z]*\b\.$/p' lines.txt

在阅读this answer on SO. 之后,我的正则表达式逻辑是匹配最后一个单词,然后检查该单词中的任何字符组合,断言存在“d”字符,然后是任何字符组合。

我哪里错了?

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    首先,非GNU sed 不支持\S/\s\b 构造。

    你可以使用

    sed -En '/d[[:alpha:]]*[^[:alpha:]]*$/p' file
    

    online demo

    #!/bin/bash
    s='Honey, I am leaving for grocery shopping. Do you want anything?
    Are you well? You look exhausted.'
    sed -En '/d[[:alpha:]]*[^[:alpha:]]*$/p' <<< "$s"
    # => Are you well? You look exhausted.
    

    d[[:alpha:]]*[^[:alpha:]]*$ 模式匹配 d,然后是零个或多个字母,然后是任意零个或多个非字母,直到字符串结尾。

    【讨论】:

    • [[:alpha:]] 是如何工作的?我不知道你可以嵌套这样的组合?谢谢,不管怎样。
    • @EdwinCarlsson [:alpha:] 是一个 POSIX 字符类,它被放入括号表达式中以便工作,[[:alpha:]] 匹配任何字母。 [^...] 是一个否定括号表达式,它匹配除其中的集合/类之外的任何字符,因此[^[:alpha:]] 匹配除字母之外的任何字符。