是否可以使用 grep 获得静态反向引用?

是否可以使用 grep 获得静态反向引用?

我尝试在多行中匹配一个组两次。

grep -Pz 'Source: (?<group>.*/).*\n.*\n.*\n.*\k<group>|$'

它可以工作,除了一个主要问题 - 它不会\k<group>搜索.*/并且不会搜索与组匹配的第一个出现的相同的字符,考虑到反向引用是动态的,这是正常的。

是否有可能获得“静态”反向引用,这意味着如果(?<test>\d\d)匹配 45 ,则下一次调用组测试将总是寻找45?

我不太擅长用英语解释技术术语,所以请随意对我大喊大叫,或者只是告诉我更具体一些。

(我在这里使用 perl grep 但如果你有一个不使用它的解决方案,请继续)

编辑:

回答下面的评论: 1:我有一个脚本,可以根据 ex if 数据批量移动大量图像文件。它工作完美,但我想测试在某些情况下源目录是否与输出目录相同。

动作示例: [1/1] (TEST - no files are being moved/copied)
Source: /disk/media/Camera/IMG_20130611_183722.jpg
Date/Time: 2013-06-11 16:37:23
Corresponding Tags: Composite:GPSDateTime
Destination (move): ./2013/06-Jun/20130611_163723.IMG_20130611_183722.jpg

这里的输入和输出不一样,所以我希望脚本不检测任何内容,但如果

Source: /disk/media/Camera/IMG_20130611_183722.jpg

前往

Destination (move): /disk/media/Camera/20130611_163723.IMG_20130611_183722.jpg

我想强调这四行。目的不是检索数据用于其他目的,而只是为了快速直观地识别检测到的文件。

有了正则表达式,它总是突出显示,因为该组的第二次出现是动态的(对于 grep 来说,两者不相同并不重要)

答案1

好吧,我想我已经明白了。您的Source: (?<group>.*/).*\n正则表达式正在捕获组中从上到最后一行group之后的所有内容。因此,对于您的示例,它正在捕获.要捕获 JPEG 图像文件名,您需要Source: //disk/media/Camera/

Source: .*/(?<group>.*)\n…

好的,我们再来一次。我相信你获取您想要的静态反向引用。问题是你没有得到你认为得到的反向引用。我认为您的捕获组(以及随后的反向引用)只是/.我不明白为什么会发生这种情况,除了大胆猜测正在.*非贪婪模式下运行,因此.*/通过第一的 /。也许这?在某种程度上被解释为这个意思。

我想你想要的可能是

Source: (?<group>.*/)[^/]*\n…

这迫使他们.*/通过最后的 /

相关内容