大神快来 sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'

LongRui888 2015-06-28 08:34:42

文件1.txt的内容是这样的:
### update test.student
### WHERE
### @1=1 /* int meta=0 */
### @2='a' /* int meta=0 */
### @3=1 /* int meta=0 */
### @4='56' /* int meta=0 */
### SET
### @1=1 /* int meta=0 */
### @2='a' /* int meta=0 */
### @3=1 /* int meta=0 */
### @4='failture' /* int meta=0 */
### update test.student


sed的命令是这样的:
sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' 1.txt

通过这个sed命令,打印出来的结果是这样的:
### update test.student
### SET
### @1=1 /* int meta=0 */
### @2='a' /* int meta=0 */
### @3=1 /* int meta=0 */
### @4='56' /* int meta=0 */
### WHERE
### @1=1 /* int meta=0 */
### @2='a' /* int meta=0 */
### @3=1 /* int meta=0 */
### @4='failture' /* int meta=0 */
### update test.student

实际上从效果来看,就是把where 和 set 交换了一下。

麻烦哪位大神给解释一下 这个命令是如何实现交换的,我试验了一下,\([^\n]*\)\n模式为什么匹配了where,而\(.*\)\n为什么匹配了当中的这个:
### @1=1 /* int meta=0 */
### @2='a' /* int meta=0 */
### @3=1 /* int meta=0 */
### @4='56' /* int meta=0 */

谢谢啦!
...全文
416 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2015-07-03
  • 打赏
  • 举报
回复
引用 6 楼 nswcfd 的回复:
[quote=引用 4 楼 yupeigu 的回复:] [quote=引用 2 楼 nswcfd 的回复:] 可以在每个sed命令后加入‘l;’命令来进行调试。
具体到上面的那个命令 ,是加在哪儿呢[/quote] 在每个分号后面加个l;(注意再加个分号),这个语句的作用是把当前buffer的内容打印出来,这样就能看清楚每行是如何操作的了。[/quote] 我试了一下,确实有打印出来,但还是看不懂。 谢谢你
nswcfd 2015-06-29
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
[quote=引用 2 楼 nswcfd 的回复:] 可以在每个sed命令后加入‘l;’命令来进行调试。
具体到上面的那个命令 ,是加在哪儿呢[/quote] 在每个分号后面加个l;(注意再加个分号),这个语句的作用是把当前buffer的内容打印出来,这样就能看清楚每行是如何操作的了。
nswcfd 2015-06-29
  • 打赏
  • 举报
回复
\([^\n]*\)\n\(.*\)\n\(.*\)/
|————————| #第一个回车之前的,就是WHERE
@@@@@@@@@@ #\n
@@@@@@@@@@@@|—————| #.*最大匹配,一直到最后一个\n之前,也就是\nSET之前的
@@@@@@@@@@@@@@@@@@@ #\n
@@@@@@@@@@@@@@@@@@@@@—————— #最后一行是SET
LongRui888 2015-06-29
  • 打赏
  • 举报
回复
引用 2 楼 nswcfd 的回复:
可以在每个sed命令后加入‘l;’命令来进行调试。
具体到上面的那个命令 ,是加在哪儿呢
nswcfd 2015-06-29
  • 打赏
  • 举报
回复
:a; #标签 N; #追加读 /SET/!ba; #如果不是/SET/,返回a,也就是重复读,一直读到/SET/之前的, #到这里,buffer的内容是WHERE\n.......\nSET s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/ #交换WHERE和SET \([^\n]*\)\n\(.*\)\n\(.*\)/ ——————————— #第一个回车之前的,就是WHERE @@@@@@@@@@@————————— .*最大匹配,一直到最后一个\n之前,也就是\nSET之前的 @@@@@@@@@@@@@@@@@@@@@@@@@@@———————— #最后一行是SET
nswcfd 2015-06-29
  • 打赏
  • 举报
回复
可以在每个sed命令后加入‘l;’命令来进行调试。
LongRui888 2015-06-29
  • 打赏
  • 举报
回复
大神们是不是 都太忙了

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧