Chinaunix

标题: vi如何删除有规律的一段数据? [打印本页]

作者: XQKA    时间: 2017-07-05 17:38
标题: vi如何删除有规律的一段数据?
create table SH.ADMIN_AUTHORITY
(
  authorityid   NUMBER(6) not null,
  authorityname VARCHAR2(255) not null,
  moduleid      NUMBER(6) not null
)
tablespace DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 1M
    next 1M
    minextents 1
    maxextents unlimited
  );

以上一段文本只是一个样本,
它的样式,可以归纳为以create table 开头,跨越多行,知道第一个;

如何用vi删除这些又规律的,跨行的文本?


作者: Shell_HAT    时间: 2017-07-05 21:29
:set nu 显示行号
:5,21d 删掉第5行到第21行

1 a
2 b
3 c
4 d
5 create table SH.ADMIN_AUTHORITY
6 (
7   authorityid   NUMBER(6) not null,
8   authorityname VARCHAR2(255) not null,
9   moduleid      NUMBER(6) not null
10 )
11 tablespace DATA
12   pctfree 10
13   initrans 1
14   maxtrans 255
15   storage
16   (
17     initial 1M
18     next 1M
19     minextents 1
20     maxextents unlimited
21   );
22 e
23 f
24 g
作者: XQKA    时间: 2017-07-06 01:15
以上一段文本只是一个样本,被分析的文件中有数百这种样式的一段文字。
作者: 关阴月飞    时间: 2017-07-06 10:39
这种需求用awk吧
作者: moperyblue    时间: 2017-07-06 10:54

  1. sed '/^create table/,/;/d' a.sql
复制代码

?
作者: sunzhiguolu    时间: 2017-07-06 10:56
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $del = 0;
  5. while(<>){
  6.         $del = 1 if(/\Acreate\s+table/);
  7.         if($del){
  8.                 $del = 0 if(/;/);
  9.                 next;
  10.         }
  11.         print;
  12. }
复制代码

perl abc.pl urFile
作者: XQKA    时间: 2017-07-06 23:30
sunzhiguolu 发表于 2017-07-06 10:56
perl abc.pl urFile

谢谢,perl不会,我用shell脚本实现了,
这样有点难度的逻辑应该是不会用一个命令就能实现的,

[root@Dev-Mysql tmp]# cat analyzer.sh
#!/bin/bash
SED=/bin/sed
GREP=/bin/grep
HEAD=/usr/bin/head
OBJ_F=/tmp/GDATADB_02.sql
RES_D=/tmp
RES_F=${RES_D}/op.sql
CRT_N=`${GREP} -n "create table" ${OBJ_F}  | ${HEAD} -1 | ${SED} s/:.*$//`
COM_N=0
until [ -z ${CRT_N} ]
do
       CRT_N=$[${CRT_N}-1]
       ${HEAD} -${CRT_N} ${OBJ_F} >>$RES_F
       echo >>$RES_F
       ${SED} -i "1,${CRT_N}d" ${OBJ_F}
       COM_N=`${GREP} -n ";" ${OBJ_F} | ${HEAD} -1 | ${SED} s/:.*$//`
       ${SED} -i "1,${COM_N}d" ${OBJ_F}
       COM_N=0
       CRT_N=`${GREP} -n "create table" ${OBJ_F}  | ${HEAD} -1 | ${SED} s/:.*$//`
       if [ -z ${CRT_N} ]
       then
       ${HEAD} -1000 ${OBJ_F} >>$RES_F
       >${OBJ_F}
       fi
done





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2