我尝试在多行中匹配一个组两次。
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…
这迫使他们.*/
通过最后的 /
。