使用awk sed linux命令将PO msgstr替换为原始文件

时间:2019-07-15 17:10:12

标签: bash awk sed

我有一个语言文件woocommerce-fr-Fr.po

我正在尝试替换第二行 (msgstr),第一行是(msgid)

之前:

msgid "Learn how to upgrade"
msgstr "Apprenez comment mettre à jour"

所需结果:

msgid "Learn how to upgrade"
msgstr "Learn how to upgrade"

有26000条som行,因此手动搜索和替换是不可行的。

这是我的代码尝试:

sed 's/\([^""]*\)msgstr\(.*\)/\1lol\2/' 1.txt

3 个答案:

答案 0 :(得分:0)

$ awk 'NR%2{print; sub(/[^ ]+/,"msgstr"); print}' file
msgid "Learn how to upgrade"
msgstr "Learn how to upgrade"

答案 1 :(得分:0)

sed不能跨换行符边界匹配(并非不可能,但这并不平凡并且有些令人沮丧),但这对于Awk来说很容易。

awk '$1 == "msgid" { s=$0; sub(/msgid/, "msgstr", s); print; print s; next }
    $1 == "msgstr" { next }
    1' woocommerce-fr-Fr.po >new.po

当我们看到msgid时,将其打印出来,然后打印一条修改过的行,其中将msgid替换为msgstr。我们会跳过所有剩余的msgstr行。其他所有内容都逐字通过。

答案 2 :(得分:0)

GNU sed解决方案:

sed '/^msgid "\([^"]*\).*/{N;s//msgid "\1"\nmsgstr "\1"/;}'

使用POSIX sed,您需要:

sed '/^msgid "\([^"]*\).*/{N;s//msgid "\1"\'$'\n''msgstr "\1"/;}'

如果一行以msgid开头,请阅读下一行,提取第一对"之间的部分,并使用msgid和msgstr输出格式化的输出。在repl中进行了测试。