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

时间:2017-09-17 16:50:24

标签: sed backreference

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

我有什么:

    s/^[a-z]+ |^[a-z]+[0-9]+/\1/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**

1 个答案:

答案 0 :(得分:2)

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

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

sed -n 's/^\s*\(\w\+\)\s\?.*/\1/p'

说明:

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

我希望这有帮助!