【问题标题】:Correct way to use bash to replace text in files使用 bash 替换文件中文本的正确方法
【发布时间】:2012-10-08 18:12:01
【问题描述】:

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

我有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

【问题讨论】:

  • 预期的输出是什么? LF_ALERT_TO = "e.mail@here.com" ?

标签: linux bash shell grep preg-replace


【解决方案1】:

如果我对您的理解正确,您可以使用 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,即。与上述步骤 1-5 匹配的内容
  2. 所需的电子邮件
  3. 关闭"(因为它没有被捕获)

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

希望这会有所帮助 =)

【讨论】:

  • 好的。我想我明白了。在电子邮件所在的位置放置一个变量有多难?如果我想查找和替换一个数字,我只需要修改第 6 步,在其中查找字符串?
  • 一点也不难,将单引号替换为双引号,并用“$EMAILVAR”代替“someone@somewhere.com”。为了清楚起见,我将编辑帖子。至于第 6 步,确切地说,您可以在其中放置一个正则表达式模式以匹配您想要的任何内容(例如 [0-9]* 用于数字)。 =)
  • 对不起,我忘了提。从单引号更改为双引号时,您还必须反斜杠内部双引号。反斜杠也是一个好主意 =)
【解决方案2】:

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

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.

【讨论】:

    【解决方案3】:

    您需要在一个文件中替换吗?如果是这样,您可以考虑使用 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" {} \;
    

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 2014-11-07
      • 2015-12-19
      • 2015-05-16
      • 2016-03-22
      • 1970-01-01
      • 2015-10-20
      • 2014-02-09
      • 1970-01-01
      相关资源
      最近更新 更多