パターンに一致する複数のファイルの行を別のファイルの行に順次置換

パターンに一致する複数のファイルの行を別のファイルの行に順次置換

複数のファイルのパターンに一致する行を別のファイルから順番に変更したいと思います。構造は最大500個のtxtファイルです。 Test1.txt、Test2.txt、Test3.txt...

11111
22222
mock
55555
77777

したがって、ファイルを1つずつ読み、最初のtest1.txtファイルの模擬行をmock.txtファイルの最初の行に置き換え、2番目のtest2.txtファイルの模擬行をmock.txtファイルに置き換えたいと思います。 in の構造は次のとおりです。

シミュレーション.txt

randomText1
randomText2
randomText3
randomText4
randomText5

フォルダの最後の.txtファイルまで続行されます。

答え1

GNU sedでは、次のことができます。

cat mock.txt | sed -i -e '/mock/{R/dev/stdin' -e 'd;}' test{1..3}.txt

R読み取りと挿入のためのGNU固有のコマンド一つrすべてを挿入する標準オプションとは異なり、一度に1行ずつ。

$ head test{1..3}.txt
==> test1.txt <==
11111
22222
randomText1
55555
77777

==> test2.txt <==
11111
22222
randomText2
55555
77777

==> test3.txt <==
11111
22222
randomText3
55555
77777
R filename

現在のサイクルの終わりまたは次の入力行を読み取るときに読み取るファイル名行を出力ストリームにキューに追加して挿入します。ファイル名を読み取れない場合、または末尾に達した場合、行は追加されず、エラー表示も表示されません。

rコマンドと同様に、ファイル名は標準入力から1行を読み取る特別な値/ dev / stdinをサポートします。

この場合、ファイルから直接行を読み取ることは機能しません/mock/R mock.txt。なぜなら、オプションはオプションを-i暗示するので、-s最初の行がmock.txt各ファイルに挿入されるからです。

答え2

GNU awk(例gawk:)を使用すると、次のことができます。

gawk -i inplace '/mock/ { getline < "mock.txt" } 1' test{1..3}.txt

sed同様に、gawk内部編集が提供されます。上記のコマンドは、regex-patternを見つけてmockそれを見つけると、regex-patternの次の行に置き換えますmock.txt。これは1常に一致するパターンなので、gawk(新しく)読み取った行を印刷する基本的な操作が行われます。内部編集中は実際にこの行は表示されません。出力を記録するには印刷ジョブが必要です。

関連情報