sed 反向引用返回它们的数字索引而不是它们的值

sed backreferences returning their numerical index rather than their value

这里有一个奇怪的问题,我似乎没有在其他地方看到重复的问题,所以在这里发帖。提前致谢。

我有以下多行 sed 代码,它正在打印更多 sed 并将命令复制到脚本中(是的,使用脚本将代码插入到脚本中)。代码如下所示:

sed -i -r '/(rpub )([$][a-zA-Z0-9])/i\  
sed -i '\''/#PBS -N/d'\'' \
cp  '"$filevariable"'' $masterscript

应该执行以下操作:

1.) 打开主脚本
2.) 在脚本
中导航到 rpub $[a-zA-Z0-9] 的每个实例 3.) 将第二行 (sed) 和第三行 (cp) 作为 rpub 实例之前的行插入,使用 \1 作为步骤 1 中匹配的 $[a-zA-Z0-9] 的反向引用。

效果很好;所有线条相对于彼此都打印得很好。但是,我所有的 \1 引用都明确显示,减去它们的反斜杠。所以我所有的 \1 都显示为 1.

我知道我的模式匹配规范工作正常,因为它们很好地固定了 rpub $[a-zA-Z0-9] 的所有实例,但我想我只是不理解反向引用的使用。有人看到这里发生了什么吗?

谢谢。

编辑 1

特别感谢下面的 Ed Morton,实现了以下内容,这让我接近了 99%,但我仍然无法通过意外行为缩小差距:

awk -v fv="$filevariable" '
match([=11=], /rpub( [$][[:alnum:]])/, a)
{
print "sed -i '\''/#PBS -N/d'\''", a[1]
}
1' "$masterscript" > tmpfile && mv tmpfile "$masterscript"

注意:我删除了一个多行打印语句,因为它在这里并不重要。但是,正如我所说,尽管这让我更接近了,但我仍然有一个问题,即打印的线条出现在 masterscript 的每一行之间;就好像匹配函数正在考虑每一行都是匹配项。这是我的错,因为我可能应该指定我希望发生以下情况:

stuff here
stuff here
rpub $name
stuff here
rpub $othername
stuff here

会变成:

stuff here
stuff here
inserted line $name
rpub $name
stuff here
insertedline $othername
rpub $othername

如有任何帮助,我们将不胜感激。谢谢!

看起来你想做的事情可以简单地用 awk 写成:

awk -i inplace -v fv="$filevariable" '
match([=10=],/rpub ([$][[:alnum:]])/,a) {
    print "sed -i \"/#PBS -N/d\", a[1]
    print "cp", a[1], fv
}
1' "$masterscript"

但没有示例输入和预期输出,这只是一个猜测。

以上使用 GNU awk 进行就地编辑,第三个参数用于 match()。

如果你想让反向引用工作,正则表达式应该用括号括起来,你的第二行是对 sed 的第二次调用,第一行什么都没有保存。