.sqlファイルで2行のセットを置き換える方法は?

.sqlファイルで2行のセットを置き換える方法は?

さまざまなステートメントを含むダンプファイルがありますINSERT。ファイルは次のとおりです

start_lines

INSERT INTO table1234 …
INSERT INTO table1234 …
INSERT INTO table1234 …

INSERT INTO table7890 …
INSERT INTO table7890 …
INSERT INTO table7890 …

 end_lines

すべてのINSERT INTO table7890ステートメントは上記のステートメントでなければなりませんINSERT INTO table1234。私は変換が発生する前と同じ場所にすべてのstart_lines合計を維持したいと思います。end_linesしたがって、たとえば、start_lines3行から18行を取得した場合は、insertステートメントを切り替えた後も、3行から18行に引き続き表示される必要があります。先端は上記と同じです。

ステートメントグループを切り替えるには?

ベストアンサー1

awk最も簡単な方法は、ファイルを2回読み取ることです。たとえば、短絡モードでは、最初は段落を保存し、2番目は交換します。

awk -v RS= -v ORS='\n\n' 'NR==FNR{
if (/table1234/) {one=$0} else if (/table7890/){two=$0}
next
}
{
if (/table1234/) {$0=two} else if (/table7890/){$0=one}
}
1' infile infile

それが重要であれば、これは末尾の空白行を印刷します。


この特別なケースでは、従来の代替アプローチがed機能します。

ed -s infile <<\IN
g/INSERT INTO table1234/d
-1r !grep -F 'INSERT INTO table7890' infile
+1,$g/INSERT INTO table7890/d
-1r !grep -F 'INSERT INTO table1234' infile
,p
q
IN

おすすめ記事