我有一个语言文件woocommerce-fr-Fr.po。
我试图将第2行(msgstr)替换为像这样的第一行(msgid )。
在此之前:
msgid "Learn how to upgrade"
msgstr "Apprenez comment mettre à jour"预期结果:
msgid "Learn how to upgrade"
msgstr "Learn how to upgrade"有26000条线,所以人工搜索和更换是不可行的。
下面是我的代码尝试:
sed 's/\([^""]*\)msgstr\(.*\)/\1lol\2/' 1.txt发布于 2019-07-15 17:27:59
sed不能跨越新的边界(这不是不可能的,但它是不平凡的,有点令人沮丧),但这是足够容易的奥克。
awk '$1 == "msgid" { s=$0; sub(/msgid/, "msgstr", s); print; print s; next }
$1 == "msgstr" { next }
1' woocommerce-fr-Fr.po >new.po当我们看到一个msgid时,我们打印它,然后打印一个修改过的行,在这里我们用msgstr替换了msgid。我们跳过的任何剩下的msgstr行。其他任何东西都会逐字通过。
发布于 2019-07-15 17:25:42
$ awk 'NR%2{print; sub(/[^ ]+/,"msgstr"); print}' file
msgid "Learn how to upgrade"
msgstr "Learn how to upgrade"发布于 2019-07-15 17:31:53
GNU sed解决方案:
sed '/^msgid "\([^"]*\).*/{N;s//msgid "\1"\nmsgstr "\1"/;}'使用POSIX sed,您需要:
sed '/^msgid "\([^"]*\).*/{N;s//msgid "\1"\'$'\n''msgstr "\1"/;}'如果一行以msgid开头,请读取下一行,提取第一对"之间的部分,然后用msgid和msgstr输出格式化的输出。在重新生成中测试。
https://stackoverflow.com/questions/57044371
复制相似问题