大家好。
我在 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'