【问题标题】:Command to replace string in one file with content of another file用另一个文件的内容替换一个文件中的字符串的命令
【发布时间】:2019-12-28 21:53:28
【问题描述】:

文件 /var/cpanel/mainip 包含我服务器的主 IP,仅此而已。 文件 /etc/csf/csf.blocklists 包含防火墙阻止列表的列表,文件的一部分包含带有示例 IP 地址 1.2.3.4 的行

通常在新服务器上安装 CSF 防火墙软件时,我会手动将示例 IP 地址替换为服务器的主 IP 地址。这是成功从某些提供商处获取防火墙阻止列表所必需的。 为了简化设置过程,我需要一个命令,将示例 IP 地址 1.2.3.4 替换为我的主服务器 IP,这样我就不必手动执行了。

我尝试了一个 sed 命令,我想我已经接近正确的命令了,但还没有完全到位。请问你能帮忙吗?

sed -i '/1.2.3.4/ { r /etc/csf/csf.blocklists }' /var/cpanel/mainip

此代码不正确,因为它输出错误:

sed: -e 表达式#1, char 0: 不匹配的`{'

成功后,应将 1.2.3.4 替换为实际服务器 IP 地址。

【问题讨论】:

  • }之前插入换行符或删除无用的{}
  • a,i,c,r,R,wW 命令都要求以换行符结尾。由于您的地址/1.2.3.4/ 后面只有一个命令,即r file,因此不需要用括号括起来。如果有第二个命令附加到同一地址,则需要括号,但也需要两个命令字符串,例如如果要删除虚拟地址行sed -e '/1.2.3.4/{r file' -e 'd}' file
  • 我认为sed -i '/1.2.3.4/ { r /etc/csf/csf.blocklists ; }' /var/cpanel/mainip 也可能有效。注意 ; 在关闭 } 之前。但我最喜欢下面的 Mihir 解决方案。我认为您修改后的文件仍将包含1.2.3.4。祝您好运。

标签: sed pipe sh cat


【解决方案1】:
sed -i "s/1\.2\.3\.4/$(</var/cpanel/mainip)/"  /etc/csf/csf.blocklists

应该做的工作。

【讨论】:

    【解决方案2】:

    你只需要指定

    sed -i '/1.2.3.4/r /etc/csf/csf.blocklists' /var/cpanel/mainip

    事实上连空格都是可选的;以下也可以使用

    sed -i '/1.2.3.4/r/etc/csf/csf.blocklists' /var/cpanel/mainip

    您只需指定模式/1.2.3.4/ 和之后的命令
    该命令可以是 r 用于读取,w 用于写入,d 用于删除以及其他一些
    d 删除条目的示例是

    sed -i '/1.2.3.4/d' /var/cpanel/mainip

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 2010-11-17
      • 1970-01-01
      • 2018-05-19
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多