Linux에서 "),("를 "),\n("로 바꾸기

Linux에서 "),("를 "),\n("로 바꾸기

여러분, 안녕하세요.

예를 들어, mysqldumpGUI 없이 Linux Ubuntu Server에서 얻은 MySQL 스크립트 파일에 다음을 삽입했습니다.

INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),(DDDD, EEEE, FFFF),(AAAA, BBBB, CCCC),(DDDD, EEEE, FFFF);

대괄호는 특별히 바꿔야 하는 문자이므로 해당 문자를 ),(로 바꾸고 싶습니다 .),\n(

),(입력을 로 어떻게 변경합니까 ),\n(?

답변1

문제는 괄호가 잘못 처리된 것이 아니라 텍스트에 줄 바꿈을 삽입하기 어려운 경우가 있다는 것입니다.

GNU 사용 sed(일반적으로 Linux 시스템에서 발견됨): 이는 단순히 문자열의 모든 항목을 (여기서 리터럴 줄 바꿈) ),(로 대체합니다. GNU는 이와 같이 인코딩된 개행 문자를 삽입할 수 있습니다 .),\n(\nsed\ns///

$ sed 's/),(/),\n(/g' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);

기준 사용 sed: 이것은 먼저 개행 문자를 "표시"하고 @다른 문자를 삽입하여 개행 문자의 위치를 ​​"표시"해야 합니다(여기서 사용된 경우 데이터에 나타나지 않는 문자를 선택하십시오). 그런 다음 y///(여기서하다\n비 GNU에서는 개행 문자로 이해됩니다 sed).

$ sed 's/),(/),@(/g; y/@/\n/' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);

위의 내용은 로 쓸 수도 있습니다 sed 's/),(/),@(/g' file | tr '@' '\n'.

표준을 사용 sed하되 개행을 로 인코딩한 \n다음 쉘이 "C-string"( $'...'일부 쉘에서 사용 가능)을 사용하여 해당 위치에 리터럴 개행을 삽입하도록 합니다.

$ sed $'s/),(/),\\\n(/g' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);

위의 "전체 표준" 변형의 마지막 부분을 참조하세요.

사용법 awk: 필드가 구분된 레코드에서 주어진 데이터를 ),(필드가 구분된 레코드로 다시 포맷 ),\n(한 다음 다시 포맷된 ​​데이터를 출력합니다.

$ awk -F '[)],[(]' -v OFS='),\n(' '{ $1 = $1; print }' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);

입력 필드 구분 기호로 사용되는 패턴 [)],[(]이며 로도 작성됩니다 \\),\\(. 괄호를 이스케이프하는 백슬래시를 이스케이프하려면 이중 백슬래시가 필요합니다. 실제로는 front 에만 사용해야 (하지만 저는 대칭을 위해 양쪽 앞에 사용했습니다(아무것도 깨지지 않고 어쨌든 \)a 와 일치합니다 )). 대칭이 마음에 들지 않으면 대신에 ),[(]또는 를 사용하세요 ),\\(.

(여기서는 특별한 경우를 awk사용법 으로 고려해야 합니다 .확장하다정규식(아님기초적인기본적으로 사용됩니다 sed).


완전성을 위해 질문에 태그가 지정되었으므로...

편집기를 사용하면 다음 을 사용하여 줄 ed에서 쉼표가 나타날 때마다 개행 문자를 삽입 할 수 있습니다.),(

g/INSERT INTO/ s/),(/),\
(/g

(첫 번째 줄의 마지막 \이스케이프된 개행 문자입니다.)

이는 s///g문자열을 포함하는 모든 행에 명령을 적용하고 INSERT INTO두 괄호 사이의 각 쉼표 뒤에 리터럴 개행 문자를 삽입합니다.

Standard 와 비슷한 작업을 수행할 수 있습니다 sed. 명령줄에서:

sed '/INSERT INTO/ s/),(/),\
(/g'

관련 정보