라인 내 차이

라인 내 차이

일부 SQL 덤프가 있는데 그 차이점을 살펴보고 있습니다. diff분명히 두 선의 차이를 보여줄 수 있지만 쉼표로 구분된 값의 긴 목록에서 어떤 값이 실제로 선을 다르게 만드는지 알아내려고 노력하고 있습니다.

일부 파일에서 두 줄 사이의 정확한 문자 차이를 지적하기 위해 어떤 도구를 사용할 수 있습니까?

답변1

가지다차이점, 이 단어의 차이점.

데스크탑에서,퓨전행 내의 차이점을 강조 표시할 수 있습니다.

답변2

git-diff를 사용하는 또 다른 방법:

git diff -U0 --word-diff --no-index -- foo bar | grep -v ^@@

grep -v 차이점 위치에 관심이 없는 경우.

답변3

나는 vimdiff이것을 사용했습니다.

스크린샷입니다(내 것이 아님) 매우 눈에 띄는 미묘한 문자 차이가 한두 개 표시됩니다. ㅏ빠른 튜토리얼도 있습니다.

1

답변4

@Peter.O 사용해결책베이스로 다시 작성하고 약간의 변경을 가했습니다.

여기에 이미지 설명을 입력하세요.

  • 각 줄을 한 번만 인쇄하고 색상을 사용하여 차이점을 표시합니다.
  • 임시 파일을 작성하지 않고 모든 것을 파이프합니다.
  • 두 개의 파일 이름을 제공하면 각 파일의 해당 줄을 비교합니다../hairOfTheDiff.sh file1.txt file2.txt
  • 그렇지 않고 원래 형식(다른 모든 줄을 이전 줄과 비교해야 하는 파일)을 사용하는 경우 이제 파이프로 연결할 수 있으며 파일을 읽을 필요가 없습니다. 소스 코드를 살펴보세요 demo. 두 개의 별도 입력 파일이 필요하지 않은 여러 파일 설명자를 사용하기 위한 멋진 파이핑의 문이 열릴 수 있습니다 paste.

강조 표시가 없다는 것은 문자가 두 줄에 있다는 것을 의미하고, 강조 표시는 문자가 첫 번째 줄에 있다는 것을 의미하고, 빨간색은 문자가 두 번째 줄에 있다는 것을 의미합니다.

색상은 스크립트 상단의 변수를 통해 변경할 수 있으며, 일반 문자를 사용하여 차이를 표현함으로써 색상을 완전히 생략할 수도 있습니다.

#!/bin/bash

same='-' #unchanged
up='△' #exists in first line, but not in second 
down='▽' #exists in second line, but not in first
reset=''

reset=$'\e[0m'
same=$reset
up=$reset$'\e[1m\e[7m'
down=$reset$'\e[1m\e[7m\e[31m'

timeout=1


if [[ "$1" != '' ]]
then
    paste -d'\n' "$1" "$2" | "$0"
    exit
fi

function demo {
    "$0" <<EOF
Paris in the spring 
Paris in the the spring
A cat on a hot tin roof.
a cant on a hot in roof
the quikc brown box jupps ober the laze dogs 
The quickbrown fox jumps over the lazy dogs
EOF
}

# Change \x20 to \x02 to simplify parsing diff's output,
#+   then change \x02 back to \x20 for the final output. 
# Change \x09 to \x01 to simplify parsing diff's output, 
#+   then change \x01 into → U+1F143 (Squared Latin Capital Letter T)
function input {
    sed \
        -e "s/\x09/\x01/g" \
        -e "s/\x20/\x02/g" \
        -e "s/\(.\)/\1\n/g"
}
function output {
    sed -n \
        -e "s/\x01/→/g" \
        -e "s/\x02/ /g" \
        -e "s/^\(.\) *\x3C$/\1 \x3C  /g" \
        -e "s/\(.\) *\(.\) \(.\)$/\1\2\3/p"
}

ifs="$IFS"
IFS=$'\n'
demo=true

while IFS= read -t "$timeout" -r a
do
    demo=false
    IFS= read -t "$timeout" -r b
    if [[ $? -ne 0 ]]
    then
        echo 'No corresponding line to compare with' > /dev/stderr
        exit 1
    fi

    diff --text -yt -W 19  \
        <(echo "$a" | input) \
        <(echo "$b" | input) \
    | \
    output | \
    {
        type=''
        buf=''
        while read -r line
        do
            if [[ "${line:1:1}" != "$type" ]]
            then
                if [[ "$type" = '|' ]]
                then
                    type='>'
                    echo -n "$down$buf"
                    buf=''
                fi

                if [[ "${line:1:1}" != "$type" ]]
                then
                    type="${line:1:1}"

                    echo -n "$type" \
                        | sed \
                            -e "s/[<|]/$up/" \
                            -e "s/>/$down/" \
                            -e "s/ /$same/"
                fi
            fi

            case "$type" in
            '|')
                buf="$buf${line:2:1}"
                echo -n "${line:0:1}"
                ;;
            '>')
                echo -n "${line:2:1}"
                ;;
            *)
                echo -n "${line:0:1}"
                ;;
            esac
        done

        if [[ "$type" = '|' ]]
        then
            echo -n "$down$buf"
        fi
    }

    echo -e "$reset"
done

IFS="$ifs"

if $demo
then
    demo
fi

관련 정보