2つのファイルを入力としてsedを使用する

2つのファイルを入力としてsedを使用する

既存の3par LUNを新しいVmax LUNと交換しようとしています。作業を簡素化するためのスクリプトを書くのに役立つ人はいますか?

3つのLUNを含むファイルとすべて新しいVMAX LUNを含むファイルなど、2つのファイルを作成できますか?その後、すべての内容を交換してください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

これは一度に1行ずつ書くことができます。読みやすくするために改行を追加しました。

このスクリプトは、他のファイルに対応する行がない限り、ファイルの行に対して偽の出力を生成しますfile1.txtfile2.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オペランドの配列を構成し、それを3番目のファイル(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);

おすすめ記事