You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用sed命令筛选出最后一个单词包含字母'd'的文本行?

你的Sed正则问题分析与修正

首先,咱们来拆解下你的正则为什么匹配不到目标行:

核心错误点

  • 强制限定行尾为句号:你正则末尾的\.$把匹配范围锁死在了仅以句号结尾的行,但示例里需要命中的第二行是以问号结尾的,直接被这个规则排除在外了。
  • 正则逻辑偏离需求:你的表达式\s*([\S]+)\b[a-zA-Z]*d[a-zA-Z]*\b\.$ 实际是在找「一个非空白单词 + 一个含d的单词 + 句号」的组合,而不是「最后一个单词含d」的行。比如示例第二行的最后一个单词是anything,但你的正则会试图在它前面找另一个独立单词,再匹配含d的单词,完全不符合文本的实际结构。
  • 未处理行尾的非字母标点:很多行的结尾会跟着问号、感叹号这类标点,你的正则没有考虑这种场景,导致这类行直接无法匹配。

修正后的命令

我们需要调整正则,让它能匹配行末尾的单词(可后跟任意非字母标点)包含字母d的行:

sed -En '/.*\b[a-zA-Z]*d[a-zA-Z]*\b\W*$/p' lines.txt

正则逐段解释

  • .*:匹配行内任意内容,直到接近末尾的单词位置
  • \b:单词边界,确保我们匹配的是完整的单词,而非单词的一部分
  • [a-zA-Z]*d[a-zA-Z]*:匹配包含字母d的任意字母组合(也就是咱们要找的含d单词)
  • \b:再次使用单词边界,避免误匹配
  • \W*:匹配0个或多个非单词字符(比如问号、句号、逗号这类行尾标点)
  • $:锚定行的结尾,确保我们定位的是该行的最后一个单词

用这个命令测试你的示例文本,如果第二行的最后一个单词实际包含d(比如可能是输入笔误),就能正确输出该行。

内容的提问来源于stack exchange,提问作者Edwin Carlsson

火山引擎 最新活动