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

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

大家好。

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

INSERT INTO `table` VALUES (AAAA, BBBB, CCCC),(DDDD, EEEE, FFFF),(AAAA, BBBB, CCCC),(DDDD, EEEE, FFFF);

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

我怎样才能将输入更改),(),\n(.

答案1

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

使用 GNU sed(通常在 Linux 系统上找到):这只是将所有出现的字符串替换),(),\n((其中\n是文字换行符)。 GNUsed能够插入像这样编码的\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,然后让 shell 使用“C-string”($'...',在某些 shell 中可用)在其位置插入文字换行符:

$ 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);

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

我们必须将(这里的特殊情况视为awk用途扩展正则表达式(不是基本的默认情况下使用的sed)。


为了完整起见,因为问题被标记为...

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

g/INSERT INTO/ s/),(/),\
(/g

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

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

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

sed '/INSERT INTO/ s/),(/),\
(/g'

相关内容