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

时间:2015-03-16 22:52:18

标签: regex bash awk sed

这里奇怪的问题我似乎没有在其他任何地方重复,所以发布在这里。提前谢谢。

我有以下多行sed代码,它将进一步的sed和copy命令打印到脚本中(是的,使用脚本将代码插入到脚本中)。代码如下所示:

sed -i -r '/(rpub )([$][a-zA-Z0-9])/i\  
sed -i '\''/#PBS -N/d'\'' \1\
cp \1 '"$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($0, /rpub( [$][[:alnum:]])/, a)
{
print "sed -i '\''/#PBS -N/d'\''", a[1]
}
1' "$masterscript" > tmpfile && mv tmpfile "$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

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

它看起来像你正在尝试做的只能用awk写成:

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

但没有样本输入和预期输出,这只是猜测。

以上使用GNU awk进行就地编辑,使用第三个arg进行匹配()。

答案 1 :(得分:0)

如果你想要一个反向引用工作,它的正则表达式应该括在括号中,你的第二行是第二次调用sed,没有从第一行保存任何内容。