Grep for .PO文件,或RegEx,用于分隔符之间的文本块

时间:2010-08-03 21:57:19

标签: regex gettext textwrangler

从这个文件开始:

msgid "a string"
msgstr ""

msgid ""
"A longer string wraps "
"on multiple lines."
msgstr ""

Grep RegEx替换所有msgstr行,如下所示:

msgid "a string"
msgstr "{a string}"

msgid ""
"A longer string wraps "
"on multiple lines."
msgstr ""
"{A longer string wraps "
"on multiple lines.}"

在我无限的天真中,我会寻找

\bmsgid "\b(*)\b"
msgstr "\b

...用

替换它
msgid "\1"
msgstr "{\1}"

但这并没有让我感到满意。在搜索网络并尝试调整Java或C#的各种解决方案之后,我放弃了,并决定在这里提问。

如果是.PO翻译文件,您在上面看到的文件语法。

我正在使用文本编辑器,Mac OS上的TextWrangler,它支持Grep RegEx语法。

谢谢。

1 个答案:

答案 0 :(得分:1)

那里有两种不同的模式。 msgid "a string"的第一种模式似乎表明msgid之后的总数据是一行模式。第二种模式``msgid“”`表示数据跟随多行。

因为它们是两种不同的模式,你会在一个正则表达式中试图将它们全部匹配。 (除非你使用Perl或者除了RegEx之外还有一些程序逻辑......)你说你想使用Text Wrangler所以我会限制我的注释到那里有效。

我认为您需要使用两个保存的模式执行两个查找/替换循环,以便在Text Wrangler(TW)中轻松完成此操作。在TW中,您可以使用模式开头的(?sm)标记使.*模式与行结尾匹配。 TW保存了之前的Grep匹配,因此一旦您获得两个可用的查找/替换模式,它就相当容易。

因此,单行模式可以与您拥有的msgid "([^"]*)"模式匹配。第二个模式可以在BB Edit或TW中与(?sm)msgid ""[^"]*(.*)msgstr ""

匹配

您可能会编写一个带有更改和命名捕获的正则表达式来匹配这两个模式并一次性替换,但是在Perl中快速编写内容会花费更少的时间......