LINUX.ORG.RU

Заменить второй матч первым.

 , ,


0

1

Всем привет. Есть патч, сформированный diff’ом, например, с таким содержимым:

diff -ruN foo/bar /home/ubik/foo/bar
--- foo/bar   2021-03-02 13:23:57.031363407 +0200
+++ /home/ubik/foo/bar     2021-03-02 14:37:01.213455947 +0200

Нужно заменить подстроку «/home/ubik/foo/bar» паттерном из первого матча, т.е. «foo/bar». Заменяемая подстрока может находиться в той же строке, либо на следующей, т.е. что-то типа такого:

diff -ruN foo/bar foo/bar
--- foo/bar   2021-03-02 13:23:57.031363407 +0200
+++ foo/bar   2021-03-02 14:37:01.213455947 +0200

Буду благодарен за помощь.

P.S. На сколько я понял, sed’ом это будет сделать сложнее, чем awk, но было бы интересно увидеть решение с sed’ом также

P.P.S. Есть возможность сформировать патч таким образом, чтобы пути в нём был одинаковыми, при этом используя разные пути для diff’a? label просто заменяет названия


$ cat replace.awk 
#!/usr/bin/awk -f

$1 == "diff" && substr($0, 0, 1) == "d" { $4 = $3 }
$1 == "---" && substr($0, 0, 1) == "-" { lastfile = $2 }
$1 == "+++" && substr($0, 0, 1) == "+" { $2 = lastfile }

{print}
$ cat test 
diff -ruN foo/bar /home/ubik/foo/bar
--- foo/bar   2021-03-02 13:23:57.031363407 +0200
+++ /home/ubik/foo/bar     2021-03-02 14:37:01.213455947 +0200
 diff -ruN foo/bar /home/ubik/foo/bar
 --- foo/bar   2021-03-02 13:23:57.031363407 +0200
 +++ /home/ubik/foo/bar     2021-03-02 14:37:01.213455947 +0200
$ ./replace.awk test 
diff -ruN foo/bar foo/bar
--- foo/bar   2021-03-02 13:23:57.031363407 +0200
+++ foo/bar 2021-03-02 14:37:01.213455947 +0200
 diff -ruN foo/bar /home/ubik/foo/bar
 --- foo/bar   2021-03-02 13:23:57.031363407 +0200
 +++ /home/ubik/foo/bar     2021-03-02 14:37:01.213455947 +0200
xaizek ★★★★★ ()