diffには削除されたコンテンツは含まれません。

diffには削除されたコンテンツは含まれません。

一部のファイルを使用しdiffてパッチを当てています。patch私が知っている限り、元のファイルを配布することは許可されていません。

今の違いは次のとおりです。

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

私はしたくない(そして様々な理由でできない)元の行が含まれています。元の行を含めずに違いを作成することは可能ですか?変えるオリジナルライン?

私が見つけた最も近いのはdiff -eビルドスクリプトを使用することですが、Debianにデフォルトでインストールされているようedではありません。 andを使ってこれを行うことedはできますか?diffpatch

編集する:たとえば、次のようなファイルを取得したいとします。

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.

一般的な diff には、次の元の行が含まれます。

2c2
< It is pretty cool.
---
> It is kinda awesome.

欲しくないオリジナルライン(「素敵ですね」)でもはいdiffファイルにあります。私は基本的に2行を次に置き換えると言うdiffファイルが欲しいです。パッチするのに必要なすべての情報がありますが、元のコンテンツはまったく含まれていないIt is some Awesomeです。本質的に私は「交換」というdiffが欲しい。どの2列に位置これ:"

patch -eスクリプトを実行するとed必要なものはすべて生成されますが、edはデフォルトでDebianに含まれていないため、使用したくありません。

2c
It is kinda awesome.
.

ベストアンサー1

diffQの意見で私が理解した内容を捉えるために「いいえ、欲しいことはできません」と答えます。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"が既存の名前と競合することが心配な場合は、この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

おすすめ記事