在文件中的某一行之前插入带有反斜杠和换行符的宏,使用sed命令。

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个回答

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

谢谢您提供的解决方案,但是如果第一个 #define 出现在注释中,则无法正常工作。例如, .... // #defines are defined in this file..bla bla bla .. #define MAX 100.. - brokenfoot
编辑以处理//注释,但对于/*注释,我不知道 :) - perreal
我已经发布了一个解决方案,它检查第一个字符应该是“#”,后面跟着“define”。 - brokenfoot

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

你的解决方案重复了这些行。我已经发布了一个有效的解决方案。 谢谢! - brokenfoot

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完全匹配的行,由模式中的^$锚定符号保证。

@perreal 我的理解是他想匹配示例程序中的第一个定义语句,即 ^#define MIN 0$。如果他想在第一个 ^#define 上执行此操作,则您已经给出了正确的答案 :)。 - Samveen
是的,我只想匹配第一个出现的。对于造成的混淆,我道歉! :) - brokenfoot

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

感谢大家的意见!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接