일부 파일을 사용 diff
하고 패치하고 있습니다. patch
제가 아는 한, 원본 파일을 배포하는 것은 허용되지 않습니다.
이제 차이점은 다음과 같습니다.
1c1
< Hello, this is the original.
---
> Hey, this is the new version.
나는 그러고 싶지 않다(그리고 여러 가지 이유로할 수 없음)원래 줄을 포함합니다. 원래 줄을 포함하지 않고 차이점을 만드는 것이 가능합니까?바꾸다원래 라인?
내가 찾은 가장 가까운 것은 diff -e
빌드 스크립트를 사용하는 것이지만 데비안에 기본적으로 설치되어 있는 ed
것 같지 않습니다 . and 를 사용하여 이 작업을 수행 ed
할 수 있습니까 ?diff
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.
일반 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
diff
Q의 의견에서 제가 이해한 내용을 포착하기 위해 "아니요, 원하는 것을 할 수 없습니다"라고 답하겠습니다. 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.