【问题标题】:Translate python regex to sed将 python 正则表达式转换为 sed
【发布时间】:2012-01-12 14:29:46
【问题描述】:

我对python的re模块有点熟悉,但对sed了解不多。 谁能帮我将以下 python 正则表达式语句转换为可用于 sed 的语句?

re.sub(r'main\s*\(([a-zA-Z_0-9\s\,\*\[\]]*)\)([a-zA-Z_0-9\s\,\*\[\]]*){' 
, r'main (\1) \2 { \n signal(SIGSEGV|SIGILL,leave);', string_buffer)

它最终会在 main 函数之后添加信号处理程序。

$ diff t.c.before t.c.after
1795c1795,1796
< int main (int argc, char** argv) {
---
> int main (int argc, char** argv)   { 
>  signal(SIGSEGV|SIGILL,leave);
1812a1814

【问题讨论】:

  • 查看正则表达式,如果我没看错,您可以 1:1 重复使用它。

标签: python regex sed awk


【解决方案1】:

这可能对你有用:

 echo 'int main (int argc, char** argv) {' |
 sed '/\<main\>.*(.*).*{.*$/a\ signal(SIGSEGV|SIGILL,leave);'
 int main (int argc, char** argv) {
  signal(SIGSEGV|SIGILL,leave);

解释:

知道.*(.*).*{.*$ 会吞噬一切,正则表达式可以缩短,因为.* 是贪婪的。 a\ 将附加剩余的文本保留间距。

【讨论】:

    【解决方案2】:

    Python main\s*\(([a-zA-Z_0-9\s\,\*\[\]]*)\)([a-zA-Z_0-9\s\,\*\[\]]*){ 正则表达式与awk 中的几乎类似:

    /main \([a-zA-Z_0-9 \,\*\[\]]*\)[a-zA-Z_0-9 \,\*\[\]]*\{/
    

    例如:

    $> cat ./text
    int main (int argc, char** argv) {
       doSomething();
       return 0;
    }
    
    $> awk '{print} /main \([a-zA-Z_0-9 \,\*\[\]]*\)[a-zA-Z_0-9 \,\*\[\]]*\{/ {print " signal(SIGSEGV|SIGILL,leave);"}' ./text
    int main (int argc, char** argv) {
     signal(SIGSEGV|SIGILL,leave);
       doSomething();
       return 0;
    }
    

    我们在这里所做的是打印每一行,当某些行与您的正则表达式匹配时,我们将在其后打印字符串。

    【讨论】:

      【解决方案3】:

      由于您可以只使用sed append 命令,因此您可以从更简单的搜索表达式开始,例如以下脚本:

      pax$ echo '
      int main (int argc, char** argv) {
         doSomething();
         return 0;
      }' | sed '/main *(/asignal(SIGSEGV|SIGILL,leave);'
      
      int main (int argc, char** argv) {
      signal(SIGSEGV|SIGILL,leave);
         doSomething();
         return 0;
      }
      

      这将在具有main 的任何行后面添加一行,后跟( 开括号,两者之间有任何空格。

      这可能不一定能捕捉到每一次出现的main,但对于通常与您描述的完全一样的绝大多数情况来说应该足够好,尽管它也可能有char *argv[]

      例如,如果您的环境有奇怪的编程标准,(例如)要求形式参数或左大括号位于不同的行,它就不会按原样工作。

      它也可能会捕获误报(例如评论中的有效main 定义),但这是大多数正则表达式解析问题的解决方案的问题。如果是这种情况,您可以在使用您正在使用的diff 方法检查它之后增加搜索对象的复杂性。

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2017-12-25
        • 1970-01-01
        相关资源
        最近更新 更多