我正在重新设定遗留代码的基础,并发现许多由脚本引起的冲突--通常是代码格式化程序。这些更改既简单又可预测,所以我可以轻松地重新运行脚本,将更改应用到代码中--这通常会给我留下三个完全相同的“片段”,它们被git的diff标记所包围。
我如何编写一个脚本来找到三个匹配的片段,并使用它们的差异标记,并将它们转换为单个代码片段?
示例:
git rebase会产生这样的结果:
<<<<<<< HEAD
ACA
BCB
||||||| parent of 0cfd85b8e3... Beautify.
AAA
BBB
=======
AAC
BBC
>>>>>>> 0cfd85b8e3... Beautify.重新运行格式化程序会给出如下结果:
<<<<<<< HEAD
ACC
BCC
||||||| parent of 0cfd85b8e3... Beautify.
ACC
BCC
=======
ACC
BCC
>>>>>>> 0cfd85b8e3... Beautify.我想转化为以下几点:
ACC
BCC我已经尝试过很多很多东西,包括grep (它与新行的斗争)和pcregrep (我与反向引用/捕获-组斗争)。有什么想法吗?
发布于 2021-08-19 22:31:35
对于这个问题,有状态的Awk程序可以非常清楚:
awk '/^<<<<<<</ { state = 1; next }
/^=======/ { state = 2; next }
/^>>>>>>>/ { state = 0; next }
state == 0 || state == 2' data
foo
prolog
AAC
BBC
epilog
bar其中data包含:
foo
prolog
<<<<<<< HEAD
ACA
BCB
||||||| parent of 0cfd85b8e3... Beautify.
AAA
BBB
=======
AAC
BBC
>>>>>>> 0cfd85b8e3... Beautify.
epilog
bar最初,我们处于状态0,因为如果state == 0尚未初始化,则state为true。我们在看到<<<<<<时切换到状态1,在看到=======时切换到状态2,然后当我们看到结束标记>>>>>>>时切换回状态0。非常简单。
只有当我们处于初始状态0(任何冲突标记之外)或状态2(冲突标记的最后一部分)时,我们才会打印行。
在所有情况下,next命令都确保我们没有失败行为。只有最后一个案例打印任何东西,所以我们知道前三个案例除了识别冲突标记和更改状态之外,什么也不做,没有打印任何东西。因此,无论处于何种状态,都不会打印冲突标记;我们知道,在状态2和返回状态0时,我们不会意外地打印=======或>>>>>>>行。
在第一个操作中,next并不是绝对必要的,因为它会转移到非打印状态1,但是包含它对于一致性来说是很好的。此外,效率:冲突标记是相互排斥的;如果检测到了=======,为什么要对<<<<<<<进行测试。
https://unix.stackexchange.com/questions/642469
复制相似问题