さまざまなステートメントを含むダンプファイルがあります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_lines
3行から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
答え2
これを行うにはいくつかの方法がありますが、私が見ることができる最も簡単な方法は次のとおりですgrep
。
grep -v table1234 test.sql; grep table1234 test.sql
まずtable1234
、ラインを除くすべてを出力してからラインのみを出力しますtable1234
。
必要に応じて新しいファイルにリダイレクトすることもできます。
(grep -v table1234 test.sql; grep table1234 test.sql) > test2.sql