【问题标题】:sed to replace the ip addresses in /opt/data/hosts in bash scriptsed 替换 bash 脚本中 /opt/data/hosts 中的 IP 地址
【发布时间】:2021-08-25 08:28:36
【问题描述】:

我有一个 bash 脚本,我希望该脚本通过删除现有 IP 地址来替换主机文件中的“IP 地址”。

我的主机文件包含以下条目..

[buildservers]
10.10.10.01
10.10.10.02
10.10.10.03
[buildservers:vars]
ansible_connection=ssh
ansible_user=root

运行脚本后我的预期结果

[buildservers]
10.10.10.11
10.10.10.12
10.10.10.13
[buildservers:vars]
ansible_connection=ssh
ansible_user=root

下面是我的 bash 脚本

#!/bin/bash
hosts=/opt/data/hosts
if [ -f $hosts ] ; then
    echo "Hosts file exists"
    update_host
    else
    echo "Hosts: No such file"
    exit 0;
 fi
update_host() {
sed -i '/^\[buildservers\].*/!b;n;c$1' $hosts
}

但它只是替换第一个 IP 地址,而不是删除现有的 IP 地址。

请提供正确的“sed”来执行此操作..

【问题讨论】:

  • 你不需要g 标志吗?
  • sed '/\[buildservers\]/ {n;N;N;s/\.0/.1/g}' 应该可以达到您想要的结果,但不是理想的解决方案。

标签: bash


【解决方案1】:

这是使用 GNU awk 的替代方法(用于就地编辑)

#!/bin/bash

hosts=/opt/data/hosts

update_host(){
  awk -i inplace ' 
    BEGIN { FS=OFS="."}
    f { 
    if (/\[buildservers:vars\]/) 
      f=0
    else $4 = $4+10
    } 
  /\[buildservers\]/{ f=1 } 
  { print } 
  ' "$hosts"
}

if [ -f $hosts ] ; then
  echo "Hosts file exists"
  update_host
else
  echo "Hosts: No such file"
  exit 0;
fi

【讨论】:

    【解决方案2】:

    你可以试试这个。 ${REPLACE} 应该是所有要替换的 IP 地址并用换行符分隔

    sed "/^\[buildservers\]/bx :x; /[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/d;by :y; 1a${REPLACE}"
    

    【讨论】:

      猜你喜欢
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2021-11-10
      • 2017-09-06
      • 2018-04-09
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多