我正在使用diff
和patch
来修补一些文件。就我而言,我不被允许分发任何原始文件。
现在,差异看起来像这样:
1c1
< Hello, this is the original.
---
> Hey, this is the new version.
我不想(并且出于各种原因不能)包括原来的行。是否可以制作一个不包含原始行的差异,只是什么取代原来的台词?
我发现的最接近的是使用diff -e
生成ed
脚本,但它看起来并没有ed
默认安装在 Debian 上。可以用diff
and来做到这一点吗patch
?
编辑:例如,我想获取一个如下所示的文件:
Hello, this is a file.
It is pretty cool.
I wrote it in a text editor.
到这样的文件:
Hello, this is a file.
It is kinda awesome.
I wrote it in a text editor.
常规差异将包含原始行,如下所示:
2c2
< It is pretty cool.
---
> It is kinda awesome.
我不想要原来的线(“这很酷。”)甚至是在差异文件中。我想要一个 diff 文件,基本上说将第 2 行替换为: It is kinda Awesome 它具有要修补的所有所需信息,但不包含任何原始内容。本质上,我想要一个 diff 说“替换任何位于第 2 行这:”。
运行patch -e
脚本ed
会生成我需要的所有内容,但我不想使用它,因为 ed 默认情况下不包含在 Debian 中。
2c
It is kinda awesome.
.
答案1
为了捕捉我从 Q 的评论中理解的内容,我将回答“不,不可能用diff
和做你想做的事情patch
”,因为它们必须包含上下文,其中包括你无法分发的内容。
既然你不能依赖ed
要在场,如果您可以信赖sed
在那里,那么您可以循环遍历更改的文件并使用表达式更新每个文件sed
:
$ cp input tempfile && \
$ sed \
-e '2s/.*/It is kinda awesome./' \
-e '4s/.*/No really, this is line 4/' \
tempfile > input && \
$ rm tempfile
我将命令分解为暗示脚本编写脚本生成上述命令的可能性,将“input”替换为需要更改的文件名,并将“-e ...”行替换为需要的内容改变。在这里,我将第 2 行和第 4 行的内容更改为相应的文本。
如果您担心“tempfile”与现有名称冲突,请查看此斯巴达系统是否具有mktemp
。您可以通过创建一个临时文件来(重新)用于每个输入文件,从而节省一些 mktemp 周期。
如果这个无 ed 系统有一个支持该-i
标志的 sed,那么您可以将该批处理简化为:
$ sed -i.orig \
-e '2s/.*/It is kinda awesome./' \
-e '4s/.*/No really, this is line 4/' \
input
mikeserv 提出了 sed 的 'c' 命令的一个很好的观点; GNU sed 似乎接受与“c”命令在同一行的替换文本,但以防万一您的不接受,这里有一个选项:
$ cat > patch.sed
2c\
this is the new line two
4c\
this is an awesomer line four
^D
$ sed -f patch.sed input > output ## or sed -i.orig -f patch.sed input
答案2
diff file1 file2 | grep ^">"
我想到了
答案3
至少对于 GNU 来说,使用合适的(行格式)说明diff
符似乎是可能的:LFMT
diff --new-line-format="replace line %-dn with:%c'\012'%L" --unchanged-line-format= --old-line-format= file1 file2
测试用:
$ cat file1
Hello, this is a file.
It is pretty cool.
I wrote it in a text editor.
$ cat file2
Hello, this is a file.
It is kinda awesome.
I wrote it in a text editor.
$ diff --new-line-format="replace line %-dn with:%c'\012'%L" --unchanged-line-format= --old-line-format= file1 file2
replace line 2 with:
It is kinda awesome.