【问题标题】:sed: modify function argumentssed:修改函数参数
【发布时间】:2011-03-03 08:57:30
【问题描述】:

我正在尝试编写一个允许我修改函数参数的 sed 命令。参数的数量可以是可变的。

如果这是我的功能:

int myFunction(int arg1, int arg2, Dog arg3) {
    // function implementation
}

我希望能够对 int arg1, int arg2, ... 执行加法运算

这是我所拥有的不起作用的:

sed -e '/^[a-zA-Z0-9_]\+\s\+[a-zA-Z0-9_]\+(/ , /)[\n\s]*{/ {
    # arguments should be listed here
}'

感谢任何帮助。放轻松,这是我第一次尝试 sed / shell 脚本。

谢谢。

【问题讨论】:

  • 如果参数数量可变,您无法单独使用正则表达式解决此问题。你至少需要一个context free grammar,或者一个hack。

标签: function sed arguments


【解决方案1】:

最终,sed 不是这项工作的正确工具 - 因为您对“参数的数量可以是可变的”的评论。如果您要处理固定数量的固定类型的参数,您可以自行解决,但任何更通用的处理都需要更通用的处理器(比sed)。

我建议尝试一个不同的任务作为你对 shell 脚本的介绍和sed

如果你必须这样做,那么也许:

sed '/^[A-Za-z_][A-Za-z0-9_]*  *[A-Za-z_][A-Za-z0-9]* *([A-Za-z_][A-Za-z0-9_]*  *\([A-Za-z_][A-Za-z0-9_]*\) *, *[A-Za-z_][A-Za-z0-9_]*  *\([A-Za-z_][A-Za-z0-9_]*\)[ ,)].*{/{p;a\
    return \1 + \2;
}' $file

那场比赛的恐怖包含序列[A-Za-z_][A-Za-z0-9_]* 6 次;它每次都匹配一个标识符。来自 '[ ,)].*{ 的段匹配第三个或后续参数。模式中的空格可能应该是 '[<blank><tab>]' 字符类,但在 StackOverflow 上输入它们很痛苦。然后正则表达式匹配一个函数定义,并捕获(在“\(<identifier>\)”部分中两个变量的名称(在您的示例中为arg1arg2)。识别时的操作是:

  1. p - 打印被识别的行。
  2. a - 将以下行附加到输出;在这种情况下,一行包含一个 return 语句,它是两个记住的参数名称的总和。反斜杠表示还有另一行要附加的输出。大括号将操作组合在一起。

sed 的某些版本比其他版本支持更强大的正则表达式;我不确定即使 GNU sed 是否支持 PCRE(Perl 兼容的正则表达式),也需要像 PCRE 这样的东西来显着减少正则表达式。

请注意,此脚本未触及注释行“// function implementation”。这就是你的决定。

最后,请记住,如果您编写多个函数来将两个整数相加,那么您就是在浪费代码。因此,这不是一个合理的转变。每个功能都应该以某种方式做一些不同的事情。诚然,如果每次类型都不同,那么它可能有其用途,但即便如此,编写生成器也比解析骨架和填充位更容易。这可能是一个很好的脚本练习。

【讨论】:

  • 您可以使用[[:blank:]]*。 Super-sed (ssed) 支持 PCRE。此外,您应该指出 sed 不进行多行正则表达式匹配,因为 OP 试图匹配 s/// 的 LHS 上的换行符。您必须使用保持空间和/或分支编写sed 脚本。而且我认为“附加”可能是有意的,而不是“附加”。
  • @Dennis: POSIX sed 确实允许 [[:blank:]] 符号 - 我在 sed 存在之前就知道了,所以我倾向于忘记它们。您的换行点只是强调sed 不是这项工作的正确工具。您将addition 解释为additional 很可能是正确的——并再次强调sed 不是工作的工具。所以,我同意你所有的cmets。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2016-01-30
相关资源
最近更新 更多