使用sed切换语句反向

时间:2015-03-04 21:43:57

标签: string bash awk 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;
    ...
}

3 个答案:

答案 0 :(得分:2)

的内容
 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和括号正确的代码。

顺便说一句,我无法想到在C语句break;语句之后直接return的原因。

答案 1 :(得分:2)

使用GNU awk进行多字符RS:

$ 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;
    ...
}

如果/当出现空格时,可以在正则表达式中自由地展开\s*

答案 2 :(得分:0)

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