替换文字(保留中间的特殊部分)

时间:2014-08-06 07:32:23

标签: regex emacs cygwin

我想

  1. 使用后缀" .org",
  2. 解析某个目录中的所有文件
  3. 在这些文件中搜索以" [[outlook:" (如下所示)

    [[展望:000000003730C053465F314590D066368CF3097B0700AAF83E03F96EDC42918E044642DEDDB3000013E2000E0000AAF83E03F96EDC42918E044642DEDDB3000013E2EFD30000] [消息:RE:消息的主题(Sendername Senderfirstname)2014-08-05 19:48]]

  4. 然后将此文本替换为 [[\ servername \ path_path_path \ path \ Projects \ outlook \ 000000003730C053465F314590D066368CF3097B0700AAF83E03F96EDC42918E044642DEDDB3000013E2000E0000AAF83E03F96EDC42918E044642DEDDB3000013E2EFD30000.msg] [消息:RE:消息主题(Sendername Senderfirstname)2014-08-05 19:48]]

  5. 这意味着" outlook://将被serverpath替换,长ID字符串(数字和字符)必须保留(这对于每个必须替换的文本都是不同的)并且在结尾处这个ID,我们必须添加" .msg"。

    对不起,如果这对您来说可能是显而易见的,但是我还不熟悉正则表达式,而且我不知道如何保留中间部分(ID)字符串)。

    **注意:*

    • 还有[[hyperlinkOrURL] [链接的文本显示]]的其他类似链,它们不以" outlook://"开头。并且不得更改!
      所以只能替换" outlook://"通过路径和所有"] [" by" .msg] ["例如

    • 我正在使用Windows 7,安装了cygwin,我有Emacs 24.3来执行此操作。

2 个答案:

答案 0 :(得分:1)

请试试这个: find:([[outlook :)([0-9A-Z] )(] [](。)(]]) 替换:[[path \ outlook \\ 2.msg \ 3 \ 4 \ 5

请参阅regex demo

答案 1 :(得分:1)

由于你安装了cygwin,你可能想给命令行一个机会,它比Emacs更适合这个工作。

find <directory> -maxdepth 1 -name "*.org" -exec sed -i 's|^\[\[outlook:\([^]]*\)|[[\\servername\\path_path_path\\path\\Projects\\outlook\\\1.msg|' {} \;

请注意,虽然您的问题提到了字符串outlook://,但您的实际示例在单词“outlook:”之后没有双斜杠,所以我没有将它们包含在正则表达式中。如果这是一个错误,请随意添加它们。

另请注意,在插入实际的服务器路径时,必须为路径的每个反斜杠写入双反斜杠:这是因为反斜杠在此处用作转义字符,例如,您可以在初始[[。括号必须转义,因为[]special meaning in regular expressions

sed命令的格式为's|<regex>|<replacement>|',即正则表达式和替换用行管字符|括起来。