如何处理sed语句中的#等特殊代码

时间:2017-04-20 08:40:53

标签: bash shell sed

我在PublicDefine.h中定义了一个marco开关来控制我的代码中的目标设备。

我的意思是根据构建shell中的选项自动替换目标句子。

下面是我的代码的和平,我收到一个错误“sed:-e expression#1,char 5:comments不接受任何地址”。

有人可以告诉我如何处理#?或者你可以给我另一个建议。谢谢!

nLine=`grep NO_LCD PublicDefine.h -nR | cut -d ":" -f 1`
dfine_nolcd="#define NO_LCD 1"
ndfine_nolcd="#undef NO_LCD "
echo $dfine_nolcd   #this is a debugging sentence
echo $ndfine_nolcd  #this is a debugging sentence
echo "nLine  $nLine"

if [ "$1"x = "NO_LCD"x ]; then
    sed -i "${nLine} ${dfine_nolcd}" PublicDefine.h 
else
    sed -i "${nLine} ${ndfine_nolcd}" PublicDefine.h
fi

2 个答案:

答案 0 :(得分:0)

sed -i '2 c xyz' file

可用于用" xyz"替换给定的文件行。

下面的句子解决了我的问题:

sed -i "${nLine} c ${dfine_nolcd}" PublicDefine.h 

答案 1 :(得分:0)

好的,正如您所注意到的,您遇到的问题是您给了sed一个行号和一个字符串,但没有给出命令。它将您的字符串中的#符号作为开始注释的命令。

但是找不到行号仍然没有必要,因为sed可以根据内容而不是行号来匹配行,所以你可以使用类似的东西:

使用给定字符串更改包含NO_LCD的任何行:

sed -e '/NO_LCD/c#define NO_LCD 1' PublicDefine.h

/regex/ - 与匹配正则表达式的行c - 将行更改为后续字符串。)

或者无条件地尝试在整行上进行字符串替换:

sed -e 's/^.*NO_LCD.*$/#define NO_LCD 1/' PublicDefine.h

假设PublicDefine.h包含

something
NO_LCD replace me
something

都打印

something
#define NO_LCD 1
something