繁体   English   中英

使用sed反向切换语句

[英]Switch statement reverse using sed

我有看起来像这样的代码:

switch (argument0) {
    case ("Goblin"):
        return 0;
    break;
    case ("Fang"):
        return 1;
    break;
    ...
}

如何使用sed或其他命令行工具在返回值和大小写之间切换,如下所示:

switch (argument0) {
    case (0):
        return "Goblin";
    break;
    case (1):
        return "Fang";
    break;
    ...
}

遵循以下原则

 sed '/^[[:space:]]*case/ { N; s/case (\(.*\)):\(.* return \)\(.*\);/case (\3):\2\1;/; }' filename

那是:

/^[[:space:]]*case/ {   # in lines that bein with "case" (optionally preceded by
               # whitespace)
  N            # fetch the next line

  # Then split, reassemble.
  s/case (\(.*\)):\(.* return \)\(.*\);/case (\3):\2\1;/
}

请注意,这仅适用于严格按照您显示的格式设置的代码,并且return直接位于case标签和括号后面的行中,是正确的方式。

顺便说一句,我想不出break;的理由break; 直接在C中的return语句之后

对于多字符RS,使用GNU awk:

$ gawk -vRS="^$" -vORS= '{$0=gensub(/(case \()([^)]+)(\):\s*return )(\S+);/,"\\1\\4\\3\\2;","g")}1' file  
switch (argument0) {
    case (0):
        return "Goblin";
    break;
    case (1):
        return "Fang";
    break;
    ...
}

如果/当可能出现空白时,在regexp中自由撒\\s* s。

sed '/^[[:space:]]*case/ {N;s/\(.*\)\("[^"]*"\)\(.*return \)\([^;]*\);/\1\4\3\2;/;}' YourFile
  • 与@Wintermute相同的概念,但带有其他分隔符。
  • 这种sed永远不可能是安全的(如此广泛的编码可能性),但是如果源文件像样本一样,则可以完成大部分工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM