强制将字符差异修补到文件

强制将字符差异修补到文件

您好,我有一个 englishStrings.json 文件,当我对其进行新的编辑/添加时,我需要将新的更改复制到所有其他语言的 string.json 文件。

在对 englishStrings 进行任何更改之前,englishStrings 和 otherLanguageStrings 具有相同的键和相同的行数,但值不同。

我正在尝试做这样的事情:

git diff -U0 —-word-diff-regex=. —-word-diff=porcelain englishStrings.json > changes.diff

patch frenchStrings.json < changes.diff

但它不适用于编辑。当我在 englishString 的键值对末尾插入逗号并需要将其传输到另一个语言字符串文件时,我想应用字符差异。

示例:EnglishString.json

{
  "a": "one",
  "b": "two",
  "test": "test",
  "c": "three",
  "edit": "edit"
}

法语字符串.json

{
“a”: “un”,
“b”: “deux”,
“c”: “trois”
}
git diff -U0 —-word-diff-regex=. —-word-diff=porcelain EnglishString.json > changes.diff
@@ -4 +4,3 @@
   "
+test": "test",
~
+  "
 c": "three"
+,
~
+  "edit": "edit"
~

补丁后预计:

{
  "a": "un",
  "b": "deux",
  "test": "test",
  "c": "trois",
  "edit": "edit"
}

但补丁目前告诉我补丁文件格式错误。补丁可能无法提供帮助,因为英语和法语字符串之间的行长度可能不同,但我愿意接受建议来更改我的解决方案

答案1

我们可能不会将问题视为文本修补问题,而是将其视为 JSON 结构合并任务,用一个 JSON 数据结构的键+值覆盖另一个 JSON 数据结构的键+值。

假设法语文件中的印刷(花式)引号实际上是普通的双引号,您可以使用 JSON 处理器jq来合并两个数据结构,如下所示:

$ jq -s 'add' EnglishString.json FrenchString.json
{
  "a": "un",
  "b": "deux",
  "test": "test",
  "c": "trois",
  "edit": "edit"
}

这会将每个文件的“字典”读取到数组元素中。表达式add中的指令将jq两个元素相加,用第二个文件中匹配的键+值覆盖从第一个文件读取的键+值。

在示例中,键abc出现在两个文件中,因此使用最后一个文件中的值。

相关内容