ライン内の違い

ライン内の違い

いくつかのSQLダンプがあり、その違いを見ています。diff明らかに、2つの線の違いを示すことができますが、カンマで区切られた値の長いリストで、どの値が実際に線を変えるかを調べようとしています。

いくつかのファイルで2行の間の正確な文字の違いを指摘するためにどのツールを使用できますか?

答え1

持つ違い、この単語の違い。

デスクトップでは、フュージョン行内の違いを強調表示できます。

答え2

git-diffを使用する別の方法:

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

grep -v違いの位置に興味がない場合。

答え3

私はvimdiffこれを使用しました。

スクリーンショット(私ではありません)非常に目立つ微妙な文字の違いが1〜2個表示されます。 ㅏクイックチュートリアルもあります

1

答え4

@Peter.Oを使う解決策ベースで書き直し、少し変更を加えました。

ここに画像の説明を入力してください。

  • 各行を一度だけ印刷し、色を使用して違いを表示します。
  • 一時ファイルを作成せずにすべてをパイプします。
  • 2つのファイル名を指定すると、各ファイルの対応する行が比較されます。./hairOfTheDiff.sh file1.txt file2.txt
  • それ以外の場合は、元の形式(他のすべての行を前の行と比較する必要があるファイル)を使用している場合は、パイプで接続でき、ファイルを読む必要はありません。ソースコードを見てくださいdemo。 2つの別々の入力ファイルを必要としない複数のファイル記述子を使用するためのクールなパイピングのドアを開くことができますpaste

強調表示がないとは、文字が2行にあることを意味し、強調表示は文字が最初の行にあることを意味し、赤色は文字が2行目にあることを意味します。

色はスクリプトの上部にある変数で変更することができ、通常の文字を使用して違いを表現することで色を完全に省略することもできます。

#!/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

関連情報