Linuxで「)、(」を「)、\ n(」に置き換える

Linuxで「)、(」を「)、\ n(」に置き換える

皆さん、こんにちは。

たとえば、mysqldumpGUIなしで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(\nsed\ns///

$ 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'

関連情報