sed:在文件中的行之前插入带有反斜杠和换行符的宏

时间:2013-06-13 07:45:21

标签: linux bash sed

我在文件中有文字,如:

#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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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的确切内容相匹配的行,并由模式中的^$锚点确保。

答案 3 :(得分: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

感谢大家的投入!