差異不包括已刪除的內容
我正在使用
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 文件中。我想要一個 diff 文件,它基本上說將第 2 行替換為: 它有點棒,它包含所有需要修補的資訊,但不包含任何原始內容。本質上,我想要一個差異,上面寫著“用這個替換第 2 行的任何內容**:”*。
執行腳本會生成我需要
patch -e
的ed
所有內容,但我不想使用它,因為 ed 預設情況下不包含在 Debian 中。2c It is kinda awesome. .
為了從 Q 的評論中獲取我所理解的內容,我將回答“不,不可能用
diff
and做你想做的事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