尝试打印匹配表达式时使用 sed 的引用 \1 无效

Invalid reference \1 using sed when trying to print matching expression

在开始之前,我已经查看了 this 问题,但解决方案似乎是他们没有在正则表达式中转义括号。我遇到了同样的错误,但我没有对正则表达式进行分组。我想要做的是在 lastlog 文件中找到所有 names/usernames 和 return UNs ONLY。

我有:

    s/^[a-z]+ |^[a-z]+[0-9]+//p

我看过很多展示如何在 awk 中执行此操作的解决方案,这对以后的参考很有帮助,但我想使用 sed 来执行此操作。

编辑例如输入:

    dzhu             pts/15   n0000d174.cs.uts Wed Feb 17 08:31:22 -0600 2016
    krobbins                                   **Never logged in**
    js24                                       **Never logged in**

如果替换命令的第一部分中没有任何捕获组,则不能使用反向引用(例如 </code>)。</p> <p>假设您想要行中的第一个单词,您可以使用以下命令 运行:</p> <pre><code>sed -n 's/^\s*\(\w\+\)\s\?.*//p'

解释:

  • -n 抑制 sed 打印它处理的每一行的默认行为
  • ^\s* 匹配行首后跟任意数量的空格
  • \(\w\+\) 捕获一个或多个单词字符(字母和数字)
  • \s\?.* 匹配一个或零个空格,后跟任意数量的字符。这是为了确保我们匹配捕获组中的整个单词
  • </code> 用捕获的组替换匹配的行</li> <li><code>p 标志打印与表达式匹配的行。结合 -n,这意味着只打印匹配项。

希望对您有所帮助!