尝试打印匹配表达式时使用 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