Bash
查找文件中的差異並按鍵排序文件
所以我有兩種語言文件,英語和法語。它們採用以下格式:
key=translation
英語的一個例子是:
ui.title=My Title
在法語中:
ui.title=Mon Titre
所以我需要一個腳本來讀取語言文件並找出差異。所以說英文文件有鍵:
ui.title=Title ui.close=Close
但是法語只有
ui.title=Mon Titre
執行腳本後,它應該輸出一個
french.changes
包含ui.close=Close
. 所以這樣,我可以將文件發送給我的翻譯,他們可以翻譯。當我取回它時,我可以簡單地執行 cat
french.changes >> french; sort -o Language_fr_FR.properties
來合併更改。我還需要一種按鍵而不是整行對語言文件進行排序的方法。
我調查了
diff
但不確定如何正確使用它。我使用 Linux 已經有一段時間了,但在編寫花哨的腳本時速度並不快 :)謝謝你的幫助!
你可以使用:
grep -v -f <(sed -r 's/([^=]*).*$/\1/' fr.i18n.txt) en.i18n.txt
從 en.i18n.txt 過濾來自 fr.i18n.txt 的所有鍵。
例子:
$ cat > en.i18n.txt ui.title=Title ui.close=Close ui.edit=Edit ui.accept=Accept ^D $ cat > fr.i18n.txt ui.title=Titre ui.edit=Modifier ^D $ grep -v -f <(sed -r 's/([^=]*).*$/\1/' fr.i18n.txt) en.i18n.txt ui.close=Close ui.accept=Accept $ FINISHED="$(grep -v -f <(sed -r 's/([^=]*).*$/\1/' fr.i18n.txt) en.i18n.txt)" $ echo "$FINISHED" ui.close=Close ui.accept=Accept
cut
@don_crissti還正確地指出,在這種情況下,過濾器列表也可以很容易地通過使用分隔符 ‘=’ 生成st欄位1
:f``d
grep -v -f <(cut -d= -f1 fr.i18n.txt) eng.i18n.txt
下面獲取兩個文件,eng 和 fr,在 key 上對它們進行排序,然後在 key 上“join”它們,只顯示文件 1 (eng) 中的任何缺失條目。
join -t= -v1 <(sort -t= -k 1,1 eng) <(sort -t= -k 1,1 fr)
所以你想要的鍵排序是例如:
sort -t= -k 1,1 eng