我正在尝试用新的 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