如何搜索多行并将这些多行替换到位?

时间:2016-10-05 04:44:24

标签: regex

目前我有基于文本的文件,这些文件的某些部分如下:

\#:some comment
msgid ""
"CCCCC"
msgstr ""

\#: some comment
msgid ""
"CCCCC"
"DDDDD"
msgstr ""

\#:some comment
msgid ""
"CCCCC"
"DDDDD"
"EEEEE"
msgstr ""

我有一个正则表达式msgid ""(([^\n#])*(\n+))+msgstr ""来匹配除评论之外的所有这些行。

我的最终目标是在msgid中或之后找到任何字符串,并将它们替换为msgstr

像:

\#:some comment
msgid ""
"CCCCC"
msgstr ""
"CCCCC"

\#: some comment
msgid ""
"CCCCC"
"DDDDD"
msgstr ""
"CCCCC"
"DDDDD"

\#:some comment
msgid ""
"CCCCC"
"DDDDD"
"EEEEE"
msgstr ""
"CCCCC"
"DDDDD"
"EEEEE"

因此,当在正则表达式中使用搜索和替换时,$ 1仅匹配每个组的最后一行。我希望$ 1可以匹配msgid和msgstr之间的字符串,以便在msgstr之后可以替换它。

任何建议都会有很大帮助!

1 个答案:

答案 0 :(得分:0)

这是一个sed示威者sed -En ":a;N;$!ba;s/msgid \"\"((([^\n#])*(\n+))+)msgstr \"\"/--\1--/g;l"。 在不了解您的环境的情况下,我选择了这个进行测试 你不需要sed,这只是为了展示我测试的内容和方式。

  • 必须逃避"
  • 技巧是添加另一个捕获组,其中包含当前(...)+
    因为位置仍然是\1
  • 示范员将匹配的字符串括在" - ",以显示匹配的内容,这是我理解的你想要的
  • 评论仍然存在,因为它们不匹配
  • msgid和msgstr不在输出中,因为它们匹配,就像你的正则表达式一样

对于给定的样本输入,它给出了输出:

\#:some comment
--
"CCCCC"
--

\#: some comment
--
"CCCCC"
"DDDDD"
--

\#:some comment
--
"CCCCC"
"DDDDD"
"EEEEE"
--

你的口味的正则表达式(我猜)
    msgid ""((([^\n#])*(\n+))+)msgstr ""

让我知道您使用的语言/工具/风格并向我展示您的代码(不仅仅是正则表达式),我会根据您的需求调整答案。
你说你想匹配msgid和msgstr之间的文本。我读到要包含""和msg * NOT以及匹配的文本。这与所需的输出不匹配 如果需要的输出比描述更重要,我也可以改变,但我需要你的代码以及你的正则表达式。