diff 不包括删除的内容

diff 不包括删除的内容

我正在使用diffpatch来修补一些文件。就我而言,我不被允许分发任何原始文件。

现在,差异看起来像这样:

1c1
< Hello, this is the original.
---
> Hey, this is the new version.

我不想(并且出于各种原因不能)包括原来的行。是否可以制作一个不包含原始行的差异,只是什么取代原来的台词?

我发现的最接近的是使用diff -e生成ed脚本,但它看起来并没有ed默认安装在 Debian 上。可以用diffand来做到这一点吗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.

相关内容