【发布时间】:2021-08-19 09:42:13
【问题描述】:
我有一个 .po 文件,如果 msgstr 为空,我需要将 msgid 值复制到 msgstr 值中。
例如
msgid "Hello"
msgstr ""
msgid "Dog"
msgstr "Cane"
应该变成
msgid "Hello"
msgstr "Hello"
msgid "Dog"
msgstr "Cane"
目前,出于测试目的,我正在处理另一个文件,但最终脚本将内联运行。
#!/bin/bash
rm it2.po
sed $'s/^msgid.*/&\\\n---&/' it.po > it2.po
sed -i '/^msgstr/d' it2.po
sed -i 's/^---msgid/msgstr/' it2.po
这个脚本有两个问题(至少):
- 当 msgstr 不为空时,也将 msgid 复制到 msgstr;
- 我很确定存在单行或更优雅的解决方案。
任何帮助将不胜感激。提前致谢。
【问题讨论】:
-
sed -i -E '/^msgid ".*"$/{N;s/^(msgid "(.*)"\nmsgstr )""$/\1"\2"/}' file -
“不适用于超过 70 个字符的行”问题可能无法重现。
sed开箱即用不会做类似的事情,尽管一些非常古老的sed实现可能有最大行长度(尽管可能要长得多)。 -
@tripleee 你是对的,问题与 sed 无关。这是由于在 sed 之前调用了 xgettext、msginit 和 msgmerge 命令。问题已更新
-
别担心
final script will works inline- 任何命令(sed、perl、ruby、gawk 等)中的-i只是语法糖,它并没有真正进行内联编辑,它使用幕后的临时文件。如果您的 sed 或任何其他命令没有用于伪就地编辑的-i,您也可以轻松地使用tmp=$(mktemp) && sed 's/old/new/' file > "$tmp" && mv "$tmp" file。