Diff

差異不包括已刪除的內容

  • February 5, 2016

我正在使用diffpatch修補一些文件。在我的情況下,我不允許分發任何原始文件。

現在,差異看起來像這樣:

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 文件中。我想要一個 diff 文件,它基本上說將第 2 行替換為: 它有點棒,它包含所有需要修補的資訊,但不包含任何原始內容。本質上,我想要一個差異,上面寫著“用這個替換第 2 行的任何內容**:”*。

執行腳本會生成我需要patch -eed所有內容,但我不想使用它,因為 ed 預設情況下不包含在 Debian 中。

2c
It is kinda awesome.
.

為了從 Q 的評論中獲取我所理解的內容,我將回答“不,不可能用diffand做你想做的事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 行上的任何內容。

如果您擔心“臨時文件”與現有名稱衝突,請查看此 spartan 系統是否具有mktemp. 您可以通過創建一個臨時文件(重新)用於每個輸入文件來節省一些 mktemp 週期。

如果這個 ed-less 系統有一個支持該-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

引用自:https://unix.stackexchange.com/questions/259981