.sql 파일에서 두 행 세트를 바꾸는 방법은 무엇입니까?

.sql 파일에서 두 행 세트를 바꾸는 방법은 무엇입니까?

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

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

관련 정보