大神快来 sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'
文件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 */
谢谢啦!