在我开始之前,我已经看过这个问题,但似乎解决方案是他们没有转义正则表达式中的括号。我遇到了同样的错误,但我没有对正则表达式进行分组。我想要做的是在 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)
\1如果在替换命令的第一部分中没有任何捕获组,则不能使用反向引用(例如)。
假设您想要该行中的第一个单词,您可以运行以下命令:
sed -n 's/^\s*\(\w\+\)\s\?.*/\1/p'
Run Code Online (Sandbox Code Playgroud)
解释:
-n 抑制 sed 的默认行为以打印它处理的每一行^\s* 匹配行首,后跟任意数量的空格\(\w\+\) 捕获一个或多个单词字符(字母和数字)\s\?.*匹配一个或零个空格,后跟任意数量的字符。这是为了确保我们匹配捕获组中的整个单词\1 用捕获的组替换匹配的行p标志打印与表达式匹配的行。结合-n,这意味着只打印出匹配项。我希望这有帮助!