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

Posted

技术标签:

【中文标题】尝试打印匹配表达式时使用 sed 的无效引用 \\1【英文标题】:Invalid reference \1 using sed when trying to print matching expression尝试打印匹配表达式时使用 sed 的无效引用 \1 【发布时间】:2022-01-18 14:21:07 【问题描述】:

在开始之前,我已经查看了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 是干什么用的? 我建议看看5.7 Back-references and Subexpressions。 包括小样本输入和预期输出将帮助我们澄清您的想法。祝你好运。 【参考方案1】:

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

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

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

解释:

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

我希望这会有所帮助!

【讨论】:

你能用它的格式化版本编辑你的帖子吗?我不知道评论中的换行符应该放在哪里,我不想假设。 已编辑。我希望这就是你要找的。​​span>

以上是关于尝试打印匹配表达式时使用 sed 的无效引用 \1的主要内容,如果未能解决你的问题,请参考以下文章

sed:-e表达式#1,字符27:在`s'命令的RHS上无效的引用 1

sed:具有反向前瞻匹配的嵌套组

如何使用 sed、awk 或 gawk 仅打印匹配的内容?

使用awk / grep / sed / bash / vim进行正则表达式匹配和打印

在 sed 中使用反向引用正则表达式

sed用法