我在文件中有文字,如:
#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
它重复数据并且仅替换一次。 任何帮助都将非常感激。
答案 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
感谢大家的投入!