diff에는 삭제된 콘텐츠가 포함되지 않습니다.

diff에는 삭제된 콘텐츠가 포함되지 않습니다.

일부 파일을 사용 diff하고 패치하고 있습니다. patch제가 아는 한, 원본 파일을 배포하는 것은 허용되지 않습니다.

이제 차이점은 다음과 같습니다.

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

나는 그러고 싶지 않다(그리고 여러 가지 이유로할 수 없음)원래 줄을 포함합니다. 원래 줄을 포함하지 않고 차이점을 만드는 것이 가능합니까?바꾸다원래 라인?

내가 찾은 가장 가까운 것은 diff -e빌드 스크립트를 사용하는 것이지만 데비안에 기본적으로 설치되어 있는 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는 기본적으로 데비안에 포함되어 있지 않기 때문에 사용하고 싶지 않습니다.

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

답변2

diff file1  file2  | grep ^">"

나는 그것에 대해 생각했다

답변3

적어도 GNU에서는 diff적절한 (라인 형식) 지정자를 사용하는 것이 가능해 보입니다.LFMT

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.

관련 정보