Você poderia implementar sua abordagem canalizando a saída diff -u
para:
perl -0777 -pe '1 while s{^-.*\n\K((?:\+.*\n)+) ((.*\n)(?:-.*\n)+)}
{-$2$1+$3}mg'
Agora não estou convencido de que não mostrar linhas comuns solitárias sempre ajuda na legibilidade. Compare por exemplo:
--- A 2018-10-01 09:37:37.606642955 +0200
+++ B 2018-10-01 09:37:40.405675295 +0200
@@ -1,8 +1,11 @@
int fib(int n) {
- if (n <= 1) {
- return n;
+ int i, t1 = 0, t2 = 1;
+ for (i = 0; i < n; ++i) {
+ int next = t1 + t2;
+ t1 = t2;
+ t2 = next;
}
- /* assinging foo */
+ /* assigning foo */
foo = (bar ? bar : complicated_stuff(*a.asd.qwe|(FLAG1|FLAG2)));
- return fib(n-1) + fib(n-2);
+ return t1;
com a saída do código perl
:
--- A 2018-10-01 09:37:37.606642955 +0200
+++ B 2018-10-01 09:37:40.405675295 +0200
@@ -1,8 +1,11 @@
int fib(int n) {
- if (n <= 1) {
- return n;
- }
- /* assinging foo */
- foo = (bar ? bar : complicated_stuff(*a.asd.qwe|(FLAG1|FLAG2)));
- return fib(n-1) + fib(n-2);
+ int i, t1 = 0, t2 = 1;
+ for (i = 0; i < n; ++i) {
+ int next = t1 + t2;
+ t1 = t2;
+ t2 = next;
+ }
+ /* assigning foo */
+ foo = (bar ? bar : complicated_stuff(*a.asd.qwe|(FLAG1|FLAG2)));
+ return t1;
Acho mais útil que diff
mostre que essa linha complicada está inalterada. Na versão expandida, você seria tentado a procurar a diferença entre os dois.
Você pode substituir o ((.*\n)
por ((.{0,20}\n)
a considerar somente linhas comuns curtas e solitárias (ou (((?:\h*\H){0,10}\h*\n)
para considerar apenas o número de não espaços em branco).