単一のライン出力を区切り文字で複数のラインに分割する必要があります;
。入力は、次のようにシェルスクリプトによって生成されます。
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:]]*//'
これにより、;
最初にすべての項目が同じ文字に変わり、その後にリテラル改行が続きます。次に、生成された各行の先頭にあるスペースを切り取ります。