1

我有一个充满设置的配置文件。就像一堆设置。我想知道如何自动替换,例如:

我有LF_ALERT_TO = "",我想添加一封电子邮件。

问题二:

我可以使用 opts 来获取电子邮件吗?例子:

./run --email e.mail@here.com

我当前的代码布局:

wget http://www.configserver.com/free/csf.tgz
tar -zxvf csf.tgz
cd csf
./install.sh
(modifiy values in /etc/csf/csf.conf
4

3 回答 3

3

如果我理解正确,您可以使用 sed 执行该任务,假设电子邮件存储在$EMAILVAR环境变量中:

sed -i -e "s/\\(LF_ALERT_TO[ \\t]*=[ \\t]*\"\\)[^\"]*\"/\\1$EMAILVAR\"/" config.txt

在这里,我们告诉 sed 替换包含(按顺序)的字符串:

  1. LF_ALERT_TO
  2. 一系列空格和/或制表符 ( [ \t]*)
  3. =
  4. 另一个空格和/或制表符序列
  5. "
  6. "不是( [^"]*)的字符序列
  7. "

项目 1-5 放在反斜线括号之间。这形成了一个捕获组,因此它们匹配的内容存储在一个名为 的辅助“变量”\1中。

然后我们生成一个字符串,包括:

  1. \1, IE。与上述步骤 1-5 匹配的内容
  2. 所需的电子邮件
  3. 结束"(因为它没有被捕获)

我们使用-i命令中的标志来告诉 sed 就地编辑文件(即使用config.txt作为输入执行命令,然后将输出存储在同一文件的顶部)。

希望这会有所帮助=)

于 2012-10-08T18:24:46.780 回答
2

如果你想LF_ALERT_TO = "e.mail@here.com"在你的 csf.conf

sed -i 's/LF_ALERT_TO = ""/LF_ALERT_TO = "e.mail@here.com"/g' csf.conf

应该管用。

如果您想将电子邮件作为变量传递:

kent$  cat csf.conf
foo
LF_ALERT_TO = ""
foo
bar
whatever
kent$  em="e.mail@here.com" 

kent$  sed  "s/LF_ALERT_TO = \"\"/LF_ALERT_TO = \"$em\"/g" csf.conf 
foo
LF_ALERT_TO = "e.mail@here.com"
foo
bar
whatever

sed -i "..." csf.conf will change the original file.

于 2012-10-08T18:28:46.510 回答
1

您需要在一个文件中替换吗?如果是这样,您可以考虑使用 vim。搜索/替换命令如下:

%s/LF_ALERT_TO = ""/LF_ALERT_TO = "email@email.com"/g

如果您需要替换一堆文件,您可以考虑使用以下命令:

find path_to_find -iname "filemask" -exec sed -i 's/LF_ALERT_TO = ""/LF_ALERT_TO = "email@email.com/g" {} \;
于 2012-10-08T18:26:16.093 回答