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
sed
file1を使用してスクリプトを生成した後、このスクリプトを実行してfile2を期待される出力に変換できます。sed
sed
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;