다양한 명령문이 포함된 덤프 파일이 있습니다 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
가장 간단한 방법은 파일을 두 번 읽는 것입니다. 예를 들어 단락 모드에서 처음에는 단락을 저장하고 두 번째에는 교체합니다.
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