diff sem incluir o conteúdo removido

1

Estou usando diff e patch para corrigir alguns arquivos. Na minha situação, não tenho permissão para distribuir nenhum arquivo original.

Neste momento, os diffs são parecidos com isto:

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

Eu não quero (e por razões não posso) incluir as linhas originais. É possível fazer um diff que não inclua as linhas originais, apenas o que substitui as linhas originais?

O mais próximo que encontrei é usar diff -e para gerar um script ed , mas não parece que o ed esteja instalado por padrão no Debian. É possível fazer isso com diff e patch ?

EDIT: Por exemplo, eu quero pegar um arquivo assim:

Hello, this is a file.
It is pretty cool.
I wrote it in a text editor.

para um arquivo como este:

Hello, this is a file.
It is kinda awesome.
I wrote it in a text editor.

Um diff regular incluiria a linha original e ficaria assim:

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

Eu não quero a linha original ("É muito legal.") para ser no arquivo diff. Eu gostaria de um arquivo diff que basicamente diz Substitua a linha 2 por: É uma espécie de awesomewhich tem todas as informações necessárias para corrigir, mas não inclui nenhum conteúdo original. Essencialmente, eu quero um diff que diga "replace whatever está na linha 2 com this:" .

Executar patch -e para fazer com que um script ed gere tudo o que eu preciso, mas não quero usá-lo, pois o ed não é incluído no Debian por padrão.

2c
It is kinda awesome.
.
    
por IBPX 05.02.2016 / 00:10

3 respostas

2

Para captar o que entendo dos comentários do Q, responderei que "não, não é possível fazer o que você quer com diff e patch ", pois eles devem incluir o contexto, que inclui conteúdo que você não pode distribuir.

Dado que você não pode confiar em ed para estar presente, se você pode confiar em sed para estar lá, então você poderia percorrer seus arquivos alterados e atualizar cada um com uma expressão sed :

$ cp input tempfile && \
$ sed \
    -e '2s/.*/It is kinda awesome./' \
    -e '4s/.*/No really, this is line 4/' \
  tempfile > input && \
$ rm tempfile

Eu quebrei os comandos para sugerir a possibilidade de um script de escrita de script que gere os comandos acima, substituindo "input" pelo nome do arquivo que precisa ser alterado e as linhas "-e ..." com o nome conteúdo que precisa mudar. Aqui estou mudando o que está na linha 2 e na linha 4 com o texto correspondente.

Se você está preocupado com "tempfile" colidindo com um nome existente, veja se este sistema spartan tem mktemp . Você pode salvar alguns ciclos mktemp criando um arquivo temporário para (re) usar para cada arquivo de entrada.

Se este sistema sem edição tiver um sed que suporte o sinalizador -i , você poderá simplificar esse lote para:

$ sed -i.orig \
    -e '2s/.*/It is kinda awesome./' \
    -e '4s/.*/No really, this is line 4/' \
  input

mikeserv traz um bom ponto com o comando 'c' do sed; O GNU sed parece aceitar o texto de substituição na mesma linha que o comando 'c', mas caso não o seu, aqui está uma opção:

$ 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
    
por 05.02.2016 / 02:49
-1
diff file1  file2  | grep ^">"

vem à mente

    
por 05.02.2016 / 00:14
-1

Pelo menos com GNU diff , parece ser possível com os especificadores LFMT (formato de linha) adequados:

diff --new-line-format="replace line %-dn with:%c'2'%L" --unchanged-line-format= --old-line-format= file1 file2

Testado com:

$ 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'2'%L" --unchanged-line-format= --old-line-format= file1 file2 
replace line 2 with: 
It is kinda awesome.
    
por 05.02.2016 / 01:33

Tags