0

我正在尝试使用 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 很陌生,所以我不确定我是否做错了,任何帮助将不胜感激!

4

2 回答 2

1

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

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

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

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

同样,更改第二个。

于 2013-08-20T17:48:48.730 回答
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 帮助我正确使用语法。

于 2013-08-20T19:49:02.100 回答