단일 라인 출력을 구분 기호로 여러 라인으로 분할해야 합니다 ;
. 입력은 다음과 같이 쉘 스크립트에 의해 생성됩니다.
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:]]*//'
이렇게 하면 ;
먼저 모든 항목이 동일한 문자로 바뀌고 그 다음에는 리터럴 줄 바꿈이 이어집니다. 그런 다음 생성된 각 줄의 시작 부분에 있는 공백을 잘라냅니다.