Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 永久反转修补程序文件_Linux_Diff_Patch - Fatal编程技术网

Linux 永久反转修补程序文件

Linux 永久反转修补程序文件,linux,diff,patch,Linux,Diff,Patch,有时,无论出于何种原因,我不得不生成(在Linux下)方向错误的补丁文件。我知道在通过补丁应用它时,我可以通过使用-R开关来处理这个问题,但是如果有一种永久反转补丁文件的方法,那就太好了。是否有一个实用程序可以做到这一点,或例如一个可以保证工作的正则表达式 更新 莱恩撒谎了。但是,它需要访问原始源文件。因此,我想我应该更新我的问题,说明我更希望在补丁文件本身的情况下实现这一点。试试: patch -R file.txt file.patch diff file.txt.orig file.txt

有时,无论出于何种原因,我不得不生成(在Linux下)方向错误的补丁文件。我知道在通过
补丁
应用它时,我可以通过使用
-R
开关来处理这个问题,但是如果有一种永久反转补丁文件的方法,那就太好了。是否有一个实用程序可以做到这一点,或例如一个可以保证工作的正则表达式

更新

莱恩撒谎了。但是,它需要访问原始源文件。因此,我想我应该更新我的问题,说明我更希望在补丁文件本身的情况下实现这一点。

试试:

patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`
编辑:

要扭转统一的差异,您需要更改三件事:

  • 补丁头
  • 块头
  • +到-和-到+
下面是a的补丁头的样子:

--- b.asm   2010-09-24 12:03:43.000000000 +1000    
+++ a.asm   2010-09-24 23:28:43.000000000 +1000
#!/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
您需要将其反转,使其看起来像这样:

--- a.asm   2010-09-24 23:28:43.000000000 +1000
+++ b.asm   2010-09-24 12:03:43.000000000 +1000    
@@ -27,7 +29,5 @@
基本上切换顺序,然后将+++切换到---反之亦然

接下来,区块头:

@@ -29,5 +27,7 @@
您需要反转数字,因此看起来如下所示:

--- a.asm   2010-09-24 23:28:43.000000000 +1000
+++ b.asm   2010-09-24 12:03:43.000000000 +1000    
@@ -27,7 +29,5 @@
基本上,切换数字对

最后,切换以+开头的每一行和以-

编辑:

要切换区块标头,可以执行以下操作:

sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"
要将+切换到-和-切换到+,可以执行以下操作:

sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"
最后:

要反转修补程序标头,请执行以下操作:

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
因此,最后,我们的(快速且肮脏)脚本如下所示:

--- b.asm   2010-09-24 12:03:43.000000000 +1000    
+++ a.asm   2010-09-24 23:28:43.000000000 +1000
#!/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
我测试了它,它似乎有效

不过,为了使事情更易于维护和清洁:

#!/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

您可以使用工具
interdiff(1)
from。特别是,
interdiff
的手册页显示:

要反转修补程序,请将/dev/null用于 差异2

所以


-q/--quiet
阻止插入
还原:
行。

我已经应用了一个补丁
patch-N-p0
,但是由于代码不完整,我开始面临编译问题。我所做的就是运行这个命令
patch-p0-R
。提到这个

+1:我没有想到这个。但是出于兴趣,有没有办法在不访问原始文件的情况下执行此操作?@Oli Charlesworth:file.txt.orig文件是patch在第一行调用时自动生成的备份。我只是用那个备份来重新生成反向补丁。@Lie Ryan:我的意思是,如果我只有补丁文件,我怎么能这样做?@Oli Charlesworth:hmm。。不要认为用
diff
patch
有办法做到这一点。如果你给我一点时间,我可能会编造一些用<代替>的脚本,反之亦然。@Lie Ryan:别为我出气!如果我知道需要反转的特定事物(例如
+
-
)不起作用,我可能自己也可以这样做。我尝试将反向修补程序应用于使用正向修补程序修补的文件,但失败了。所以这并不能产生一个正确的反向补丁,至少不是所有的补丁。我不知道interdiff是坏了还是这个方法错了我明白了,这应该是根据interdiff的手册页工作的,所以这是一个错误interdiff@matteo
-q
对我来说是必需的。编辑。