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

Aut*_*nas 0 backreference sed

在我开始之前,我已经看过这个问题,但似乎解决方案是他们没有转义正则表达式中的括号。我遇到了同样的错误,但我没有对正则表达式进行分组。我想要做的是在 lastlog 文件中找到所有名称/用户名并仅返回 UN。

我拥有的:

    s/^[a-z]+ |^[a-z]+[0-9]+/\1/p
Run Code Online (Sandbox Code Playgroud)

我已经看到许多解决方案展示了如何在 awk 中执行此操作,这对于将来参考非常有用,但我想使用 sed 来执行此操作。

编辑例如输入:

    dzhu             pts/15   n0000d174.cs.uts Wed Feb 17 08:31:22 -0600 2016
    krobbins                                   **Never logged in**
    js24                                       **Never logged in**
Run Code Online (Sandbox Code Playgroud)

ale*_*lay 5

\1如果在替换命令的第一部分中没有任何捕获组,则不能使用反向引用(例如)。

假设您想要该行中的第一个单词,您可以运行以下命令:

sed -n 's/^\s*\(\w\+\)\s\?.*/\1/p'
Run Code Online (Sandbox Code Playgroud)

解释:

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

我希望这有帮助!