有时,无论出于何种原因,我都必须生成错误方向的补丁文件(在Linux下).我知道我可以通过-R在应用它时使用开关来解决这个问题patch,但是如果有一种永久性地反转补丁文件的方法会很好.是否有可以执行此操作的实用程序,或者例如可以保证有效的正则表达式?
UPDATE
Lie Ryan 提出了一个巧妙的方法.但是,它需要访问原始源文件.所以我想我应该更新我的问题,说明我更多的是在一种方法实现这一点,只给出补丁文件本身.
cam*_*amh 49
您可以使用该工具interdiff(1)从patchutils.特别是,手册页interdiff说:
要反转补丁,请对diff2使用/ dev/null.
所以,
$ interdiff -q file.patch /dev/null > reversed.patch
Run Code Online (Sandbox Code Playgroud)
所述-q / --quiet防止插入reverted:线.
Lie*_*yan 15
尝试:
patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`
Run Code Online (Sandbox Code Playgroud)
编辑:
要反转统一差异,您需要更改三件事:
所以这里是一个看起来像的补丁头:
--- b.asm 2010-09-24 12:03:43.000000000 +1000
+++ a.asm 2010-09-24 23:28:43.000000000 +1000
Run Code Online (Sandbox Code Playgroud)
你需要反转它,所以它看起来像这样:
--- a.asm 2010-09-24 23:28:43.000000000 +1000
+++ b.asm 2010-09-24 12:03:43.000000000 +1000
Run Code Online (Sandbox Code Playgroud)
基本上切换顺序,并将+++切换到---反之亦然.
接下来,块头:
@@ -29,5 +27,7 @@
Run Code Online (Sandbox Code Playgroud)
你需要反转数字,所以它看起来像这样:
@@ -27,7 +29,5 @@
Run Code Online (Sandbox Code Playgroud)
基本上,切换数字对
最后,切换以+开头的每一行以及以 - 开头的每一行.
编辑:
要切换块头,你可以这样做:
sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
Run Code Online (Sandbox Code Playgroud)
切换+到 - 和 - 到+,你可以这样做:
sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"
Run Code Online (Sandbox Code Playgroud)
最后:
要反转补丁头,请执行以下操作:
head -2 orig.diff | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > head
tail orig.diff -n+3 > tail
cat head tail > headtail
rm head tail
Run Code Online (Sandbox Code Playgroud)
所以,最后,我们的(快速和脏)脚本看起来像:
#!/usr/bin/env sh
F="$1"
head -2 $F | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > $F.head
tail $F -n+3 | sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/" -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/" > $F.tail
cat $F.head $F.tail
rm $F.head $F.tail
Run Code Online (Sandbox Code Playgroud)
我测试了它,它似乎工作.
但是,要使事情更易于维护和清洁:
#!/usr/bin/env sh
swap() {
sed -e "s/^$1/PPP/" -e "s/^$2/$1/" -e "s/^PPP/$2/"
}
file_header() {
head -2 $1 | tac | swap +++ ---
}
fix_chunk_header() {
sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
}
fix_lines() {
swap + -
}
file="$1"
file_header $file
tail $file -n+3 | fix_chunk_header | fix_lines
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15338 次 |
| 最近记录: |