한 줄을 여러 줄로 나누려면 구분 기호를 사용하세요.

한 줄을 여러 줄로 나누려면 구분 기호를 사용하세요.

단일 라인 출력을 구분 기호로 여러 라인으로 분할해야 합니다 ;. 입력은 다음과 같이 쉘 스크립트에 의해 생성됩니다.

REVOKE ALL ON XXXXXX_ABC_AAA FROM PUBLIC ; REVOKE ALL ON XBJE_XXXXX_ABC_AAA FROM PUBLIC ; REVOKE ALL ON XBJE_XXADTXXX_ABC_AAA FROM PUBLIC ; REVOKE ALL ON XBJE_XXVXXX_ABECC_AAA FROM PUBLIC ;

다음과 같이 여러 줄로 나누어야 합니다.

REVOKE ALL ON XXXXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXADTXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXVXXX_ABECC_AAA FROM PUBLIC ;

어떻게 해야 하나요?

답변1

간단하게 다음으로 sed변환을 사용할 수 있습니다 .;;\n

$ line="REVOKE ALL ON XXXXXX_ABC_AAA FROM PUBLIC ; REVOKE ALL ON XBJE_XXXXX_ABC_AAA FROM PUBLIC ; REVOKE ALL ON XBJE_XXADTXXX_ABC_AAA FROM PUBLIC ; REVOKE ALL ON XBJE_XXVXXX_ABECC_AAA FROM PUBLIC ;"

$ sed 's/; */;\n/g' <<< "$line"
REVOKE ALL ON XXXXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXADTXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXVXXX_ABECC_AAA FROM PUBLIC ;

따라서 스크립트가 호출되면 foo.sh다음을 수행합니다.

foo.sh | sed 's/;/;\n/g'

답변2

사용법 tr과 기준 sed:

$ tr -s ';' '\n' <file | sed -e 's/^[[:blank:]]*//' -e 's/$/;/'
REVOKE ALL ON XXXXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXADTXXX_ABC_AAA FROM PUBLIC ;
REVOKE ALL ON XBJE_XXVXXX_ABECC_AAA FROM PUBLIC ;

그러면 먼저 모든 세미콜론이 개행 문자로 바뀌고, 생성된 각 줄의 시작 부분에 있는 공백이 제거되고 끝에 세미콜론이 추가됩니다.

입력이 bash또는 zsh쉘 변수에 저장되어 있는 경우 다음을 사용하십시오.

printf '%s;\n' "${var//;/;$'\n'}" | sed 's/^[[:blank:]]*//'

이렇게 하면 ;먼저 모든 항목이 동일한 문자로 바뀌고 그 다음에는 리터럴 줄 바꿈이 이어집니다. 그런 다음 생성된 각 줄의 시작 부분에 있는 공백을 잘라냅니다.

관련 정보