diff без включения удаленного контента

Я использую diff и patch для исправления некоторых файлов. В моей ситуации мне не разрешено распространять какой-либо исходный файл.

Прямо сейчас, различия выглядят примерно так:

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

Я не хочу (и по причинам не могу) включать исходные строки. Можно ли сделать diff, который не включает исходные строки, что заменяет исходные строки?

Самое близкое, что я нашел, это использование diff -e для генерации сценария ed , но по умолчанию Debian по умолчанию не установлен. Можно ли это сделать с помощью diff и patch ?

EDIT: Например, я хочу взять файл, который выглядит так:

 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. Мне нужен файл diff, который в основном говорит о замене строки 2: «Это любопытно, что у него есть вся необходимая информация для исправления, но не содержит ни одного оригинального контента. По сути, мне нужен diff, который говорит: «Замените все, что есть в строке 2, с этим:» .

Запуск patch -e для создания сценария ed генерирует все, что мне нужно, но я не хочу использовать его, поскольку ed по умолчанию не включен в Debian.

 2c It is kinda awesome. . 

Чтобы понять, что я понимаю из комментариев 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 

Я сломал команды, чтобы намекнуть на возможность сценария сценария, который будет генерировать вышеупомянутые команды, заменяя «ввод» на имя файла, которое необходимо изменить, и строки «-e …» с содержимым, которое необходимо изменить. Здесь я изменяю все, что находится в строке 2 и строке 4 с соответствующим текстом.

Если вы обеспокоены тем, что «tempfile» сталкивается с существующим именем, посмотрите, есть ли в этой спартанской системе mktemp . Вы можете сэкономить несколько циклов mktemp, создав один временный файл для (re) для каждого входного файла.

Если в этой системе ed-less есть sed, поддерживающий флаг -i , вы можете упростить эту партию:

 $ 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 
 diff file1 file2 | grep ^">" 

приходит в голову

По крайней мере, с diff GNU, возможно, с подходящими спецификаторами LFMT (line format):

 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.