文字の違いをファイ​​ルに強制的にパッチ

文字の違いをファイ​​ルに強制的にパッチ

こんにちは、私は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"
}

フランス語 string.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プロセッサを使用して次の2つのjqデータ構造をマージできます。

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

これは、各ファイルの「dict」を配列要素として読み込みます。式addのコマンドはjq2つの要素を追加し、最初のファイルから読み取られたキー+値を2番目のファイルの一致するキー+値で上書きします。

例では、キーaとキーbc両方のファイルに表示されるため、最後のファイルの値が使用されます。

関連情報