我想查看2个合并文件的完整输出,其中每个差异的标记方式都与git标记文件中的冲突相同。 用例是合并2个类似的配置文件,检查合并的文件,并具有直观的提示以表明文件之间的所有差异,以便于轻松选择哪个文件。
我已经尝试过使用diff和diff3,但是我只能得到差异(使用diff)或仅标记了冲突的完全合并的文件(使用diff3 -m -A file1 file1 file2
)。我使用了git diff和相关工具,但是它们都合并了无冲突的更改,而不是将它们标记为差异。
正在运行的环境将是一个bash shell脚本,因此最好使用常见的linux工具达到所需的输出。
示例:
文件1的内容:
environment:
base_branch: master
branch: this_is_the_same_for_both_files
文件2的内容:
environment:
base_branch: a_different_base_branch
branch: this_is_the_same_for_both_files
a_new_key: the_new_key_value
所需的输出:
environment:
<<<<< file1
base_branch: master
=====
base_branch: a_different_base_branch
>>>>> file2
branch: this_is_the_same_for_both_files
<<<<< file1
=====
a_new_key: the_new_key_value
>>>>> file2
答案 0 :(得分:1)
根据评论中的建议,我想出了一款似乎可以解决我问题的衬垫。
我本来想在sed
替换中使用常量作为标记,但是对于Mac OS,显然要使用包含\n
和sed
的变量并不容易。
即使在使用diffutils的docker alpine:3.8中,此代码也似乎正常工作。 其他选项(酿造和类似的酿造法)可能不容易携带。
diff -D AAAAAAA "${path}" <(echo -n "$decrypted") | \
sed -e $'s/#ifndef AAAAAAA/<<<<<<< file-on-disk/g' | \
sed -e $'s/#endif \/\* ! AAAAAAA \*\//=======\\\n>>>>>>> file-from-secret/g' | \
sed -e $'s/#else \/\* AAAAAAA \*\//=======/g' | \
sed -e $'s/#ifdef AAAAAAA/<<<<<<< file-on-disk\\\n=======/g' | \
sed -e $'s/#endif \/\* AAAAAAA \*\//>>>>>>> file-from-secret/g';
说明:
diff -D AAAAAAA "${path}" <(echo -n "$decrypted")
:输出带有'#ifdef NAME'差异的合并文本。我正在使用AAAAAAA作为标记名称。 Diff使用#ifndef AAAAAAA
和#endif /* ! AAAAAAA */
包围仅出现在第一个文件中的文本,而/#ifdef AAAAAAA
和#endif /* AAAAAAA */
包围仅出现在第二个文件中的文本。请注意第一个n
中的#ifndef
和第一个!
注释中的#endif
。由于所有标记均不同,因此替换变得容易。
sed -e $'s/#endif \/\* ! AAAAAAA \*\//=======\\\n>>>>>>> file-from-secret/g'
:将标记替换为
=======
>>>>>>> file-from-secret
由于存在\n
,所以替换字符串用$''
括起来,它可以正确解释换行符。但是,\
需要两次转义。