diff에서 이동 한 줄을 무시하는 방법


11

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

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

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


어쩌면 특정 언어 순서로 함수를 생성하고 선언을 가져 오기 위해 도구를 변경하는 것이 더 쉬운가?
Daniel Beck

@Daniel Beck : 아래 Gilles의 답변에 대한 의견을보십시오.
dnadlinger 2016

오래된 주제이지만 아래 주석을 요약하면 diff코드의 명령 순서 중요하고 이것이 사실이 아닌 경우 (수입, 함수 및 클래스 선언, 등)?
Joël

@ Joël : 대답은 테스트해야하는 생성기 변경이 줄 순서 변경과 관련된 버그를 유발하지 않는다는 것입니다. 물론 일반적인 경우 (또는 단순히 생성기의 포괄적 인 테스트 스위트)에서 오탐을 피하기 위해 대상 언어에 대한 파서 기반 도구가 필요하지만 빠른 일회성 검사이기도합니다. 리뷰를 코딩합니다.
dnadlinger

답변:


2

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

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


정확히 무엇을 해야하는지 잘 모르겠지만 원하는 결과를 얻지 못하는 것 같습니다. 내가 질문을 이해로서, 코드의 두 가지 예에서 /tmp/old/tmp/new전혀은 diff 결과를 주변에 이동 된 단지 라인이 이후 싶어 할 것입니다. 그러나이 코드는 결과를 생성합니다.
Ilari Kajaste

코드를 수정했습니다.
l0b0

오래 전에 위에서 언급 한 병합 프로세스를 완료했을 때 답변을 테스트하지 않았지만 코드를 한 눈에 볼 때 작동하는 것처럼 보입니다.
dnadlinger

4

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

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는 모든 줄 번호와 컨텍스트 정보를 잃어 버리기 때문에 그다지 유용하지 않습니다…
dnadlinger

그래도 더 나은 솔루션을 원하더라도이 방법을 사용하여 작업중인 변경 사항을 확인했습니다.
dnadlinger

2
이것이 일부 변경 사항을 놓칠 위치를 예측할 수 있습니다. 때로는 주문이 중요하고 때로는 그렇지 않습니다. 모든 컨텍스트를 버립니다.
Rich Homolka 2016 년

내가 존재하는 모든 것이 여전히 수행되도록하고 싶었던 주문 리 팩터의 경우 이것이 바로 내가 필요한 것입니다.
ntrrobng

0

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


죄송하지만이 답변은 전혀 도움이되지 않습니다. 너무 쉬운 경우 즉시 변경하겠습니다. 더욱이, 나는 현재 발전기가 원래 분기 된 프로젝트의 변경 사항을 병합하고 있으므로, 훨씬 광범위한 변경 사항을 추가하면 프로세스가 더욱 복잡해질 것입니다.
dnadlinger

0

파일을 섹션으로 구성되어있는 경우,이 순서가 바로 섹션, 그리고 당신이, 당신이 할 수있는 섹션 헤더를 인식하는 데 사용할 수있는 정규 표현식이 존재 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.