在 Linux 中将 "),(" 替换为 "),\n("

Kek*_*e22 1 sed awk replace ed

大家好。

我在 MySQL 脚本文件中插入了以下内容作为示例,该文件是从mysqldump没有 GUI 的 Linux Ubuntu Server 中获取的。

INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),(DDDD, EEEE, FFFF),(AAAA, BBBB, CCCC),(DDDD, EEEE, FFFF);
Run Code Online (Sandbox Code Playgroud)

我想替换字符),(),\n(因为括号是特别要替换的。

如何将输入更改),(),\n(.

Kus*_*nda 6

问题并不在于括号处理起来有问题,而是换行有时很难在文本中插入。

使用 GNU sed(通常在 Linux 系统上找到):这只是),(),\n((其中\n是文字换行符)替换所有出现的字符串。GNUsed是能够插入编码为新行\ns///这样的。

$ sed 's/),(/),\n(/g' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
Run Code Online (Sandbox Code Playgroud)

使用标准sed:第一个“标记”换行符应该通过插入其他字符(@此处使用,选择数据中未出现的字符)来“标记”换行符的位置。然后将这些换出换行符使用y///(在非 GNU 中确实理解\n为换行符sed)。

$ sed 's/),(/),@(/g; y/@/\n/' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
Run Code Online (Sandbox Code Playgroud)

上面也可以写成sed 's/),(/),@(/g' file | tr '@' '\n'.

使用标准sed,但将换行符编码为\n,然后让外壳使用“C 字符串”($'...',在某些外壳中可用)在其位置插入文字换行符:

$ sed $'s/),(/),\\\n(/g' file
INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF),
(AAAA, BBBB, CCCC),
(DDDD, EEEE, FFFF);
Run Code Online (Sandbox Code Playgroud)

请参阅上述“完全标准”变体的最后。

使用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);
Run Code Online (Sandbox Code Playgroud)

用作输入字段分隔符的模式[)],[(], 也可以写成\\),\\(. 您需要双反斜杠来转义转义括号的反斜杠。你真的只需要在 前面(使用它,但我在两者前面都使用它来对称(它不会破坏任何东西;无论如何都\)匹配 a ))。如果你不喜欢对称,使用),[(]),\\(代替。

我们必须对待(特地在这里的awk用途扩展的正则表达式(没有基本的那些sed默认情况下使用)。


为完整起见,由于问题标有 ...

使用ed编辑器,您可以),(使用以下命令在一行中每次出现的逗号后插入换行符

g/INSERT INTO/ s/),(/),\
(/g
Run Code Online (Sandbox Code Playgroud)

\第一行的最后一个转义换行符。)

这将s///g命令应用于包含 string 的所有行INSERT INTO,并在两个括号之间的每个逗号之后插入一个文字换行符。

你可以用标准做类似的事情sed。从命令行:

sed '/INSERT INTO/ s/),(/),\
(/g'
Run Code Online (Sandbox Code Playgroud)