使用 sed 使用两个文件作为输入

使用 sed 使用两个文件作为输入

我正在尝试用新的 Vmax LUN 替换旧的 3par LUN。有人可以帮我制作一个脚本来简化任务吗?

是否可以创建 2 个文件,一个文件具有 3par LUN,另一个文件具有所有新的 VMAX LUN?然后替换掉所有的内容mulipath.conf

目前我正在使用:

sed -i "s/360002ac000000000000001f20001add7/60002ac000000000000001f20001accb/g" multipath.conf

有人可以帮助使命令起作用吗?

sed "s/`cat 3par.txt`/`cat vmax.txt`/g" multipath.conf

答案1

$ perl -e '
   open(F1,"<",shift);
   open(F2,"<",shift);
   while(<F1>) {
     chomp; # strip trailing \n from input file.
     $new=<F2>;
     chomp $new;
     print "s/$_/$new/g\n"
   }' file1.txt file2.txt
s/360002ac000000000000001f20001add7/60002ac000000000000001f20001accb/g
s/360002ac000000000000001f20001add8/60002ac000000000000001f20001accc/g
s/360002ac000000000000001f20001add9/60002ac000000000000001f20001accd/g
s/360002ac000000000000001f20001ade0/60002ac000000000000001f20001acce/g

这可以是(并且被写成)一行行,我添加了换行符以使其更具可读性。

如果file1.txt没有与 相同的行数file2.txt,则此脚本将为一个文件中的任何行生成虚假输出,而另一个文件中没有相应的行。所以不要这样做。

要将这些更改应用到您的multipath.conf文件,请运行上面的 perl one-liner 并将输出重定向到文件(例如sedscript.sed),然后运行:

sed -f sedscript.sed multipath.conf

验证生成的sed脚本是否执行您想要的操作,然后将输出重定向到新文件,或使用 的sed选项-i对其自身进行“就地”编辑multipath.conf。当然,首先要进行备份,然后将其复制到-i(甚至-i.bak)无法触及的安全位置。

示例输入文件是:

$ cat file1.txt 
360002ac000000000000001f20001add7
360002ac000000000000001f20001add8
360002ac000000000000001f20001add9
360002ac000000000000001f20001ade0

$ cat file2.txt 
60002ac000000000000001f20001accb
60002ac000000000000001f20001accc
60002ac000000000000001f20001accd
60002ac000000000000001f20001acce

顺便说一句,只要多做一点工作,这个 Perl 单行代码就可以读取 file1 和 file2,构造一个 s/old/new/g 操作数组,然后将它们应用到第三个文件(例如 multipath.conf)

例如:

#!/usr/bin/perl

# run with three arguments:
# $1 = file containing old patterns
# $2 = file containing replacements
# $3 = file to modify

# THIS SCRIPT IS A CRUDE, MINIMALIST EXAMPLE AND CONTAINS NO ERROR
# CHECKING/HANDLING CODE AT ALL. USE AT OWN RISK.

use strict;
use File::Slurp;

# hash to store the search patterns and their replacements.
my %regex=();

open(F1,"<",shift);
open(F2,"<",shift);
while(<F1>) {
  chomp; # strip trailing \n from input file.
  my $new=<F2>;
  chomp $new;
  # qr// pre-compiles the regular expression, so it doesn't have to be
  # compiled on every pass through the loop.
  $regex{qr/$_/} = $new;
};
close(F1);
close(F2);

my $f3=shift;

my @file3=read_file($f3);

# transform and overwrite the third file.
open(F3,">",$f3);
foreach (@file3) {
  foreach my $key (keys %regex) {
        s/$key/$regex{$key}/g;
  }
  print F3;
};
close(F3);

答案2

给定两个名为“old”的文件...

$ cat old
old1
old2
old3

和“新”

$ cat new
new1
new2
new3

您可以为 sed 创建脚本文件,如下所示:

$ paste old new | while read old new; do printf "s/%s/%s/g\n" "$old" "$new"; done |tee sedfile
s/old1/new1/g
s/old2/new2/g
s/old3/new3/g

并将该文件与 sed 一起使用:

sed -f sedfile mulipath.conf > review-this.conf

相关内容