皆さん、こんにちは。
たとえば、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
、文字列を含むすべての行にコマンドを適用し、2つのINSERT INTO
括弧の間の各カンマの後にリテラル改行文字を挿入します。
Standardと同様のことができますsed
。コマンドラインから:
sed '/INSERT INTO/ s/),(/),\
(/g'