在包含reg表达式的字符串上使用sed

时间:2013-08-20 17:26:43

标签: sed

我正在尝试使用sed执行查找/替换和插入,但我不断收到一条消息,指出“n命令末尾有额外字符”。我也没有从终端运行它,它嵌入在shell脚本中,所以我可以将它发送给其他人。

这就是我正在尝试运行的

sed -i 's/include "/var/run/racoon/*.conf" ;/# include "/var/run/racoon/*.conf" ;/g' ~/Documents/test.conf;
sed '$a; include "/etc/racoon/remote/*.conf" ;/g' ~/Documents/test.conf;

为了便于查看,我正在尝试替换

include "/var/run/racoon/*.conf" ;

# include "/var/run/racoon/*.conf" ;

然后添加此

include "/etc/racoon/remote/*.conf" ;

基本上,我只想注释掉文件的最后一行,然后在它后插入一行。我对sed很新,所以我不确定我是否会这么做错,任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:1)

您尝试的内容至少有两个问题:

  • 您需要使用不同的分隔符,因为您的模式和替换包含/。您可以使用|
  • 模式中的*需要转义\*

因此,第一个表达式看起来像:

sed -i 's|include "/var/run/racoon/\*.conf" ;|# include "/var/run/racoon/*.conf" ;|g' ~/Documents/test.conf;

同样,改变第二个。

答案 1 :(得分:1)

如果遇到任何人遇到此问题,您必须下载gnu-sed或通过其他方式执行此操作。

如果您安装了Homebrew,可以轻松下载gnu-sed。

brew install gnu-sed

或者你可以像我一样使用perl和printf

进行更换

sudo perl -pi -e 's|include "/var/run/racoon/\*.conf" ;|# include "/var/run/racoon/*.conf" ;|g' /etc/racoon/racoon.conf;

添加一行。对我来说它总是139行,所以我可以走这条路。

line='include "/etc/racoon/remote/*.conf" ;'
sudo printf '%s\n' H 139i "$line" . wq | ed -s /etc/racoon/racoon.conf

感谢devnull帮助我正确理解语法。