替换匹配的不同编码标签

时间:2017-01-30 22:56:21

标签: bash macos character-encoding

我有一个由其他人翻译的file。我不知道该人使用了什么编码,但似乎不应翻译的标签$TAG$被转换为另一组字符(即使标签看起来相同,ASCII字符也是如此include,不是original source file中的字符。这搞乱了西里尔字符进一步替换为扩展的ASCII字符(这不是问题的一部分)。所以我的替换脚本也替换了标签(至少部分)。

使用原始标记中的相应标记替换损坏文件中的标记的最佳方法是什么?

文件必须是UTF-8(带BOM),EOL = LF。

Mac bash最好,谢谢。

1 个答案:

答案 0 :(得分:1)

一个策略是列出当前的utf8标签列表,ascii标签列表,排列它们,然后使用pastesed将utf8标签替换为ascii标签乌克兰文件:

grep -o '\$[^\$]\+\$' rights_of_man_l_ukrainian.txt | sort | uniq > utf8.tags.list
grep -o '\$[^\$]\+\$' rights_of_man_l_english.txt | sort | uniq > ascii.tags.list

# now, manually edit ascii.tags.list so that each line number has
# the correct replacement for that line of utf8.tags.list, e.g.,
# by using:
vimdiff utf8.tags.list ascii.tags.list

# escape the $s
sed -i 's/\$/\\$/g' utf8.tags.list ascii.tags.list

# now substitute the tags
paste utf8.tags.list ascii.tags.list |
  while read n k; do
    sed "s/$n/$k/g" rights_of_man_l_ukrainian.txt
  done > rights_of_man_l_ukrainian.ascii-tags.txt

更令人满意的方法是自动生成utf到ascii转换表。在mac上,iconvperl Text::Unidecode都将utf8字符串变为垃圾。在Linux上,konwert在这里显示了承诺。

ps:看起来还有另一个问题,但是:两个缺少的标签:

FORCEBREAKALLIANCEDESC:1“如果他们接受,我们两个国家对我们的意见都将减少,$ WITH | Y $将会让我们获得一个Casus Belli。\ n这也将在$ COUNTRY | Y $和我们之间产生休战,如同以及$ TRUSTCOST | R $降低他们对我们的信任。否则,我们将失去$ PRESTIGE $ Prestige。“

VS

FORCEBREAKALLIANCEDESC:1“Якщовонипогодяться,тоставленняобохкраїндонасзменшиться,адержава$WIТН| Y $отримаєпривіддлявійнизнами\nТакожбудеоголошеноперемир'яміждержавою$СОUNТRY| Y $танами, атакожзменшитьїхнюдовірудонас.Віншомувипадку,мивтратимо$РRЕSТIGЕ$престижу。“

(缺少$ TRUSTCOST | R $)

stat_game_country_desc_server:0“$ VAL | Y $%的玩家本月扮演$ NAME | Y $。”

VS

stat_game_country_desc_server:0“Всередньому,вцьомумісяціугравціввідбулосяблизько$VАL| Y $лих。”

(缺少$ NAME | Y $)