合并两个文件,向每个文件添加缺少的字符串(取自另一个)

时间:2014-04-02 14:16:27

标签: git bash merge cross-platform diff

我正在寻找git bash(可能是......需要跨平台)命令,该命令需要两个文件路径并继续执行以下操作:

  1. 两个文件之间的差异,并添加到每个文件中没有字符串 (取自另一个)。因此,如果我有文件A和B,我想将(B-A)插入A,将(A-B)插入B. 行的顺序确实重要
  2. 以格式打印输出:
    • 第一个文件路径
    • 添加到其中的字符串(格式为'+ string number:string content',不带撇号)
    • 第二个文件路径
    • 添加到其中的字符串(格式为'+ string number:string content',不带撇号)
  3. 有可能吗?有人可以提供任何线索(等有用的代码)吗?

1 个答案:

答案 0 :(得分:1)

您可以使用grep -v -f-F来避免使用特殊字符)来查找文件之间的差异。这将返回文件B中的所有行但不返回文件A,然后将这些行附加到文件A的底部:

grep -vFf file_A file_B >> file_A

由于您也希望输出行,因此将它们存储在变量中是有意义的,因此您不必多次运行它(并且避免在附加到文件并获取后运行命令时出现任何问题不同的结果)。然后,您可以遍历该变量并使用数字打印出每一行:

#!/bin/bash
missing_from_A=$(grep -vFf "$1" "$2")
missing_from_B=$(grep -vFf "$2" "$1")
[[ -n "$missing_from_A" ]] && echo "$missing_from_A" >> "$1"
[[ -n "$missing_from_B" ]] && echo "$missing_from_B" >> "$2"

i=0
echo "First file: $1"
while read line; do
    [[ -n "$line" ]] && printf "+%s:%s\n" $((i+=1)) "$line" || echo "No missing lines found"
done <<< "$missing_from_A"

i=0
echo "Second file: $2"
while read line; do
    [[ -n "$line" ]] && printf "+%s:%s\n" $((i+=1)) "$line" || echo "No missing lines found"
done <<< "$missing_from_B"

然后使用要作为参数运行的文件调用脚本:

$ ./my_script.sh /home/user/file1.txt /home/user/file2.txt

示例输出(当然,文件也被修改):

First file: file1.txt 
+1:second line in f2
+2:fourth line in f2
Second file: file2.txt
+1:second line in f1
+2:fourth line in f1
+3:fifth line in f1