여러분, 안녕하세요.
예를 들어, mysqldump
GUI 없이 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(
\n
sed
\n
s///
$ 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'