diff 명령이 두 번째 파일(bash)의 특정 줄을 무시하도록 하려면 어떻게 해야 합니까?

diff 명령이 두 번째 파일(bash)의 특정 줄을 무시하도록 하려면 어떻게 해야 합니까?

예를 들어:

파일 1.txt:

I need to buy apples.
I need to run the laundry.
I need to wash the dog.
I need to get the car detailed.

파일 2.txt

I need to buy apples.
I need to run the laundry.
I need to wash the car.
I need to get the car detailed.

파일 3.txt

I need to wash the car.

이렇게 하면 diff file1.txt file2.txtdiff 명령은 file2.txt에 있는 경우 file3.txt에 있는 명령문을 무시해야 합니다. 따라서 이 경우에는 차이가 없어야 합니다.

무시 플래그( diff -I "$line")를 사용하면 두 파일 모두에서 패턴을 찾을 수 있으므로 도움이 되지 않습니다.

어떻게 해야 하나요?

답변1

해결 방법은 해당 행을 삭제한 다음 비교하는 것입니다. 즉, 둘 다 다음과 file1같습니다 file2.

I need to buy apples.
I need to run the laundry.

I need to get the car detailed.

grepperl, 및 다음을 조합하여 이 작업을 수행 할 수 있습니다 sed.

$ lines_to_ignore=$(grep -nFf file3 file2 | perl -pe 's|^(\d+):.*|$1s/.//g;|')
$ echo $lines_to_ignore 
3s/.//g;
$ diff <(sed "$lines_to_ignore" file1) <(sed "$lines_to_ignore" file2)        
$ echo $?
0
  • 나는 grep(행 번호와 함께) 일치하는 행을 얻는 데 사용합니다file2
  • perl그런 다음 출력에서 ​​줄 번호를 가져 와서 grepsed 명령을 생성했습니다( Ns/.//gN 줄의 모든 문자 제거).
  • sed그런 다음 프로세스 대체를 사용하여 파일에 대해 이러한 명령을 실행한 결과를 diff.

답변2

diff여기 에서 다음을 결합할 수 있습니다 combine.

$ diff file1.txt <(combine file2.txt NOT file3.txt)
3d2
< I need to wash the dog.

OP의 변경 사항을 반영하도록 업데이트되었습니다.

답변3

grep 옵션을 사용하여 파일에서 행 필터링

$ diff f1 f2
3c3
< I need to wash the dog.
---
> I need to wash the car.
$ diff <( grep -v -f f3 -x f1) <( grep -v -f f3 -x f2)
3d2
< I need to wash the dog.

어디

  • <( )임시 파일을 생성하기 위한 bash 구문입니다.
  • grep에서
    • -x거짓말 전체를 일치시키다
    • -f f3f3 파일에서 패턴 가져오기
    • -v일치하지 않는 패턴 표시

답변4

diff아마도 올바른 도구가 아닐 것입니다. 꼭 써보셔야 할 것 같습니다comm, 각 줄을 하나의 파일, 다른 파일 또는 두 파일 모두에 공통으로 분류합니다.

그러나 주요 제한은 comm두 입력 파일을 모두 정렬해야 한다는 것 입니다.

관련 정보