我有一个包含各种语句的转储文件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 行,则在切换插入语句后,它们应该继续出现第 3 行到第 18 行。结束行同上。
如何切换语句组?
答案1
最简单的方法是读取文件两次,第一次保存段落,第二次交换它们,例如awk
(在段落模式下):
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
如果重要的话,这将打印一个尾随空行......
ol' 的另一种方法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