一致するものが見つかった場合は、ファイルaの部分文字列をファイルbの文字列に置き換えます。

一致するものが見つかった場合は、ファイルaの部分文字列をファイルbの文字列に置き換えます。

2つのファイルがあります。

ファイル1

This is a string = mystringrocks
This is another string = mystringrocksmore

ファイル2

Trying to figure out: This is a string
Still trying to figure it out: This is another string

希望の出力:

Trying to figure out: mystringrocks
Still trying to figure it out: mystringrocksmore

私はたくさん試しましたが、最近は2つのファイルを配列にロードし、sedループを使用しました。

#!/bin/bash    
declare -a a
readarray a <filea.txt
echo $a

declare -a b
readarray b <fileb.txt
echo $b

for line in 'fileb.txt';
 do sed -i -- 's/$line/$a/' file.txt 
 done

役に立たない。

ベストアンサー1

sedfile1を使用してスクリプトを生成した後、このスクリプトを実行してfile2を期待される出力に変換できます。sedsed

sed 's!^!s/!;s! = !/!;s!$!/!' file1 | sed -f- file2

最初の出力sedは次のとおりです。

s/This is a string/mystringrocks/
s/This is another string/mystringrocksmore/

必要な交換作業を明確に行います。

スラッシュと感嘆符を含む文字列にも機能するPerlを使用することもできます。

perl -wE 'while (<>) {
              chomp;
              ($from, $to) = split / = /;
              $h{$from} = $to;
              last if eof;
          }
          $regex = join "|", map quotemeta, keys %h;
          s/($regex)/$h{$1}/, print while <>
         ' file1 file2

最初のファイルを読み取り、各行を分割し、ペアを=ハッシュ$from => $toに保存します。次に、すべてのキー(つまり、キーが出たキー)に基づいて正規表現を生成し、2番目のファイルを繰り返して一致するものをハッシュに格納されている値に置き換えます。同じ位置から始まる2つのパターンがある場合は、長さの長い文字列を使用するために長さでキーを並べ替えることも一般的です。

map quotemeta, sort { length $b <=> length $a } keys %h;

おすすめ記事