2014-09-12 15 views
0

我有类似下面的一些源代码,我调用C功能:如何递减(。减去)号文件与sed的

void myFunction (
    &((int) table[1, 0]), 
    &((int) table[2, 0]), 
    &((int) table[3, 0]) 
); 

...唯一的问题是,函数> 300个参数(它是一个自动生成的封装器,用于初始化和调用整个模块;它被给予我,我不能改变它)。正如你所看到的那样:我开始用1而不是0来访问阵列......好时光,用手修改所有300个参数,即去除300×阵列的x坐标。

我正在寻找解决的办法是,我怎么能强迫sed到做的工作对我来说)

编辑:请注意,上述访问在C二维数组的语法是错误的呢!当然,这应该是[1][0] ......(所以不要只是复制和粘贴;))

+0

插入'&((int)table [0,0]),'并删除最后一个参数。 – Cyrus 2014-09-12 17:32:16

+0

我不确定你可以用sed做算术运算。 – 2014-09-12 20:22:37

+0

@Cyrus:哈哈,那会有效; D只有它的问题:在我的“真实”代码中,我在所有参数行之间注释行来描述每个参数的作用。所以它也会转移所有的嘉奖,因此你的解决方案不适用于我的情况。虽然在大多数其他情况下它是一个很好且简单的解决方案;) – mozzbozz 2014-09-15 11:11:00

回答

1

基本上,命令我来到了,是以下几点:

sed -r 's/(.*)(table\[)([0-9]+)(,)(.*)/echo "\1\2$((\3-1))\4\5"/ge' inputfile.c > outputfile.c 

那么,这看起来并不直观 - 我发现几乎所有的例子都没有很好的解释。

所以我会尽量给详细解释这个:

sed 

- >基本命令

-r 

- >您发现正在使用-e最例子;但是,-r参数(仅适用于GNU sed)启用扩展正则表达式,并在正则表达式中支持+。它基本上意味着“一个或多个匹配”。

's/input/output/ge' 

- >这是基本的替换语法。它基本上意味着“用'输出''替换'输入'”。 /g是一个“全球”标志,即sed将取代所有的出现,而不仅仅是第一个。您可以添加额外的e以在bash中执行结果。这是我们在这里要做的处理计算。

(.*) 

- >这个匹配 “寄托都” 从最后一场比赛到下一场比赛

(table\[) 

- >的\是逃避支架。表达的这一部分将匹配字符串等table[

([0-9]+) 

- >这一个与至少一个数字匹配号码,但是,它也可以与多于仅一个位匹配更高的数字。

(,) 

- >这只是相匹配的逗号,

(.*) 

- >并再次:该行的其余

现在最有趣的部分:

echo "\1\2$((\3-1))\4\5" 
  • echo是bash命令
  • \n(您可以使用从\1\9的每个值)是某种“变量”的输入:\1将包含第一个匹配,\2秒匹配,... - >这可以帮助您保留部分输入字符串
  • $((1+1))是一个简单的bash语法,用于计算双括号内的项的值(在上面的完整sed命令中,\3当然会被第三个匹配自动替换,即括号内的第一部分访问表格单元格)
  • 请注意,我们在回声内容周围使用引号也能够处理与像&字符,否则将不工作

这些线在端部已经提到的\gee将触发导致在bash的执行。例如。在问题的源代码示例的前两行会产生以下的bash语句:

echo "void myFunction (" 
echo " &((int) table[$((1-1)), 0])," 
正在执行和

导致以下输出:

void myFunction (
    &((int) table[0, 0]), 

...这是exatcly我想要的东西:)

BTW: 文本> output.c 是简单的bash语法输出text(或在这种情况下,sed -processed源代码)到一个文件名为output.c


有关此主题的良好的联系是:

啊还有一两件事:你也可以在git-Bash在Windows上使用sed - 如果你被迫“像我一样在工作中使用Windows;)

PS:在此期间,我可以很容易地通过手,但采用SED是更多的乐趣这样做;)

1

这里的另一种方式,你可以做到这一点,使用Perl:

perl -pe 's/(table\[)(\d+)(,)/$1.($2-1).$3/e' file.c 

这将使用e修饰符在替换中执行表达式。捕获组连接在一起,但中间组从其值减去1。

这将输出到标准输出,所以你可以检查它是否做你想要的。当你快乐时,你可以添加-i开关覆盖原始文件。

+0

我发现很多用Perl解决这个问题的解决方案。无论如何,你需要在你的电脑上安装Perl。当你在一家公司工作并且没有管理员权限时,这个解决方案可能无法帮助你(这是我的情况)。但是还是要指出这点,如果perl已经安装,这可能会更容易! – mozzbozz 2014-09-12 16:41:34