diff에서 이동 한 줄을 무시하는 방법 중요하지 않은 행 (예

현재 소스 코드 생성 도구를 개발 중입니다. 변경 사항으로 인해 새로운 버그가 발생하지 않도록 변경 diff하기 전후의 프로그램 출력 사이의 이론은 이론적으로 유용한 도구입니다.

그러나 도구는 순서가 중요하지 않은 행 (예 : import명령문, 함수 선언 등)을 임의 순서로 반올림 하여 출력하기 때문에 생각보다 어렵습니다 . 이 때문에 diff실제로는 동일한 파일에서 다른 위치로 행만 이동하는 많은 변경 사항으로 인해 출력 이 복잡해집니다.

diff가 이러한 움직임을 무시하고 실제로 추가되거나 제거 된 줄만 출력하는 방법이 있습니까?



답변

간단한 diff를 수행하고 결과를 어딘가에 저장하고 (다른 diff를 피하기 위해) 두 버전의 줄을 반복 한 다음 다른 쪽에서 줄을 제거하십시오.

이것은 작업 코드에 대한 별도의 프로젝트 를 생성했습니다 . 코드.


답변

먼저 분류하려고 할 수 있습니다. 다음과 같은 것 :

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash (및 zsh)는 프로세스 대체로 한 줄로 이것을 할 수 있습니다

diff <(sort file-a) <(sort file-b)

답변

도구를 제어하는 ​​것처럼 들립니다. 그런 다음 출력을 예측 가능하게 만드십시오. 선언을 반 무작위 순서로 내보내는 대신 알파벳 순서를 마지막 수단으로 사용하십시오. 이것은 diff에서 쓸모없는 cruft를 제거 할뿐만 아니라 도구의 출력을 인간이 읽고 쉽게 확인할 수 있다는 이점이 있습니다.


답변

파일을 섹션으로 구성되어있는 경우,이 순서가 바로 섹션, 그리고 당신이, 당신이 할 수있는 섹션 헤더를 인식하는 데 사용할 수있는 정규 표현식이 존재 csplit 섹션의 페어를 비교 한 후 자신의 섹션으로 파일을하고.

예를 들어, 데이터베이스 이름 중 일부가 대 / 소문자가 변경된 후 두 개의 MySQL 덤프에서이를 비교하여 덤프를 다른 순서로 나열했습니다.

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff