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(
.
问题并不在于括号处理起来有问题,而是换行有时很难在文本中插入。
使用 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);
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 ...
使用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)