在 Unix 中用不同文件中的另一行文本替换一行

在 Unix 中用不同文件中的另一行文本替换一行

我有一个包含 200 多个绑定扩展文件的列表,其中包含精确的子域信息。

示例模式如下所示。

# /named_ext/db.mysite.com
subdomain                    A       200.201.202.203

我需要将整条线替换为一组三条不同的线,就像这样。

subdomain                    A       200.201.202.204
subdomain                    A       200.201.202.205
subdomain                    A       200.201.202.206

知道如何在所有/named_ext/文件下执行这种替换吗?

答案1

您可以使用以下 perl 脚本通过三个恒定 ip(函数)或三个增量 ip(函数)exchange_ips.pl来交换 ip 。只需在脚本末尾不需要的函数调用前面添加注释 ( )。exchange_const()exchange_incr()#

请注意,如果原始 IP 以253或更高结尾,则一个或多个增量 IP 将不正确。

该脚本修改以 开头的所有行$domainname。如果域名无关紧要或者文件仅包含一个/同一个域的行,则设置my $domainname = ".+";

/usr/bin/perl 的 #!

使用严格;
使用警告;

我的@data = <STDIN>;

我的$domainname =“子域名”;
我的$const_ip1 = “123.123.123.123”;
我的$const_ip2 = “124.124.124.124”;
我的$const_ip3 = “125.125.125.125”;

我的$pattern = qr/^($domainname\s+A\s+)([\d\.]+)/is;

子交换常数($){
    我的 $dataref = shift;
    我的$found = 0;
    foreach (@$dataref) {
        如果 ($_ =~ m/$pattern/) {
            除非 ($found) {
                $找到= 1;
                printf "%s%s\n%s%s\n%s%s\n", $1,$const_ip1,$1,$const_ip2,$1,$const_ip3;
            }
        } 别的 {
            打印$_;
        }
    }
}

子 exchange_incr($) {
    我的 $dataref = shift;
    我的$found = 0;
    foreach (@$dataref) {
        如果 ($_ =~ m/$pattern/) {
            除非 ($found) {
                $找到= 1;
                我的 $const = $1;
                我的@iparr = 拆分/\./, $2;
                对于(1 .. 3){
                    $iparr[3]++;
                    printf "%s%s\n", $const, join ".", @iparr;
                }
            }
        } 别的 {
            打印$_;
        }
    }
}

# 使用固定 IP 来交换 IP
交换常量(\@数据);

# 使用增量 IP 交换 IP
exchange_incr(\@data);

像这样调用脚本:

perl exchange_ips.pl < your_file

循环遍历所有文件(带备份):

for f in /named_ext/*; do rename s/$/.bak/ $f; perl exchange_ips.pl < $f.bak > $f; done

例子:

要修改的示例文件:

# 一些 foo
子域名 A 200.201.202.203
# 复制
子域名 A 200.201.202.203
# 一些酒吧
其他域名 A 99.99.99.99
其他域 A 1.1.1.1
# 另一个重复项
子域名 A 200.201.202.203

输出exchange_const()

# 一些 foo
子域名 A 123.123.123.123
子域名 A 124.124.124.124
子域名 A 125.125.125.125
# 复制
# 一些酒吧
其他域名 A 99.99.99.99
其他域 A 1.1.1.1
# 另一个重复项

输出exchange_incr()

# 一些 foo
子域名 A 200.201.202.204
子域名 A 200.201.202.205
子域名 A 200.201.202.206
# 复制
# 一些酒吧
其他域名 A 99.99.99.99
其他域 A 1.1.1.1
# 另一个重复项

答案2

小型 Bash 脚本

您可以使用sed对每个文件执行的简单命令来执行此操作:

for f in ./named_ext/* ; do
    sed -r -i 's/subdomain[ ]+A[ ]+200.201.202.203/subdomain A 200.201.202.204\nsubdomain A 200.201.202.205\nsubdomain A 200.201.202.206/g' $f
done

解释

for 循环枚举并使用文件./named_ext/*运行该行。将扩展正则表达式并将就地编辑文件。sed$f-r-i

正则表达式替换

subdomain                    A       200.201.202.203

任意数量的空格

subdomain A 200.201.202.204
subdomain A 200.201.202.205
subdomain A 200.201.202.206

如果要保留间距,可以在行中添加空格sed

答案3

#!/bin/bash

tempFile=tempFile

for f in /named_ext/* ; do
    awk '
    BEGIN {FS = OFS = "."}

    /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ {
        for (i=0; i<3; i++) {
            $4++
            print $0
        }
    }' $f > $tempFile
    mv $tempFile $f
done

相关内容