基本上,命令我来到了,是以下几点:
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
当然会被第三个匹配自动替换,即括号内的第一部分访问表格单元格)
- 请注意,我们在回声内容周围使用引号也能够处理与像
&
字符,否则将不工作
这些线在端部已经提到的\ge
e
将触发导致在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是更多的乐趣这样做;)
插入'&((int)table [0,0]),'并删除最后一个参数。 – Cyrus 2014-09-12 17:32:16
我不确定你可以用sed做算术运算。 – 2014-09-12 20:22:37
@Cyrus:哈哈,那会有效; D只有它的问题:在我的“真实”代码中,我在所有参数行之间注释行来描述每个参数的作用。所以它也会转移所有的嘉奖,因此你的解决方案不适用于我的情况。虽然在大多数其他情况下它是一个很好且简单的解决方案;) – mozzbozz 2014-09-15 11:11:00