3

我在一个文件中有如下文本:

#include<stdio.h>
#include<stdlib.h>

#define MIN 0
#define MAX 100

我想在第一个 #define 之前插入一个宏,例如:

#include<stdio.h>
#include<stdlib.h>

#define MAXIMUM(a,b) \ 
(a>b?(return a):(return b))
#define MIN 0
#define MAX 100

我用 sed 试试运气,但没有那么成功。我必须在 bash 脚本中执行此操作,比如 add_macro.sh,它的执行方式为:

./add_macro file.c

并包含:

var1="#define"
var2="#define MAXIMUM(a,b) \ /\n(a>b?(return a):(return b))"
sed "H;${x;s/$var1 .*\n/$var2&/;p;}" $1 > $1.tmp

当我运行上述脚本时,它会执行以下操作:

#include<stdio.h>
#include<stdlib.h>

#define MIN 0
#define MAX 100


#include<stdio.h>
#include<stdlib.h>

#define MAXIMUM(a,b)          //no '\' is printed
(a>b?(return a):(return b))
#define MIN 0
#define MAX 100

它重复数据并且只替换一次。任何帮助将不胜感激。

4

4 回答 4

1
var1="#define"
var2='#define MAXIMUM(a,b) \\ \
    (a>b?(return a):(return b))'
sed "0,/^$var1/{/^$var1/s/$var1/$var2\n$var1/}" $1

或者更短一点:

sed "0,/^$var1/s/^$var1/$var2\n$var1/" $1
于 2013-06-13T08:10:30.433 回答
0

我知道了:

var2='#define MAXIMUM(a,b) \\\n(a>b?(return a):(return b))'
var1='#define'
sed "H; 0,/^$var1 .*/s//$var2\n&/1;" $1 > $1.tmp

感谢大家的投入!

于 2013-06-13T08:56:20.700 回答
0
var1="#define MIN"
var2="#define MAXIMUM(a,b) \\\\ \n(a>b?(return a):(return b))"
sed "s/${var1}.*$/$var2\n&/g;" $1 > $1.tmp
于 2013-06-13T08:16:20.600 回答
0

一个更简单的模式:

var1="#define MIN 0"
var2="#define MAXIMUM(a,b) \\\\\n(a>b?(return a):(return b))"
cat test.c |sed "s%^\($var1\)$%$var2\n\1%g"

你得到:

samveen@precise:/tmp$ bash replace.sh
#include<stdio.h>
#include<stdlib.h>

#define MAXIMUM(a,b) \
(a>b?(return a):(return b))
#define MIN 0
#define MAX 100

这也确保了它只会替换那些仅与 的确切内容匹配的行,由模式中的和锚点var1确保。^$

于 2013-06-13T08:21:24.743 回答