웹을 검색 한 후 Lekensteyn의 대체 방법이 내가 찾은 더 나은 방법입니다.
그러나 dif 출력을 패치로 사용하고 싶습니다. "grep -v"때문에 행 번호가 유지되므로 문제가 있습니다.
그래서 나는이 명령 줄을 개선하려고합니다.
diff -u -B <(sed 's/^[[:blank:]]*#.*$/ /' file1) <(sed 's/^[[:blank:]]*#.*$/ /' file2)
완벽하지는 않지만 줄 번호는 패치 파일에 유지됩니다.
그러나 주석 줄 대신 새 줄을 추가하면 패치 할 때 주석이 Hunk FAILED를 생성합니다.
File test1:
text
#comment
other text
File test2:
text
new line here
#comment changed
other text changed
지금 우리의 명령을 테스트
$ echo -e "#!/usr/bin/sed -f\ns/^[[:blank:]]*#.*$/ /" > outcom.sed
$ echo "diff -u -B <(./outcom.sed \$1) <(./outcom.sed \$2)" > mydiff.sh
$ chmod +x mydiff.sh outcom.sed
$ ./mydiff.sh file1 file2 > file.dif
$ cat file.dif
--- /dev/fd/63 2014-08-23 10:05:08.000000000 +0200
+++ /dev/fd/62 2014-08-23 10:05:08.000000000 +0200
@@ -1,2 +1,3 @@
text
+new line
-other text
+other text changed
/ dev / fd / 62 & / dev / fd / 63은 프로세스 대체에 의해 생성 된 파일입니다. "+ new line"과 "-other text"사이의 줄은 주석을 대체하기 위해 sed 표현식에 정의 된 기본 공백 문자입니다.
그리고 이제이 패치를 적용 할 때오고있는 것은 :
$ patch -p0 file1 < file.dif
patching file file1
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file file1.rej
해결책은 -u없이 통합 diff 형식을 사용하지 않는 것입니다
$ echo "diff -B <(./outcom.sed \$1) <(./outcom.sed \$2)" > mydiff.sh
$ ./mydiff.sh file1 file2 > file.dif
$ cat file.dif
1a2
> new line
3c4
< other text
---
> other text changed
$ patch -p0 file1 < file.dif
patching file file1
$ cat file1
text
new line
#comment
other text changed
이제 패치 파일 작업 파일 (복잡한 diff 프로세스의 결과에 대한 보증없이).
-I
옵션을 사용하면 모든 행이 정규 표현식과 일치하는 경우에만 블록이 무시됩니다 . 따라서 주석 전용 변경은 무시할 수 있지만 주석이 아닌 변경에 가까운 주석 변경은 무시할 수 있습니다.