LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1148|回复: 14

这个正则表达式怎么写啊?

[复制链接]
发表于 2003-9-15 22:22:57 | 显示全部楼层 |阅读模式
我想匹配从上一个@<TRIPOS>MOLECULE到下一个@<TRIPOS>MOLECULE之间的内容,该怎么写啊?多谢
@<TRIPOS>MOLECULE
NSC#479
@<TRIPOS>ATOM
     31 H31        -3.1419   -3.4336    0.1147 H       1              0.0633
     32 H32         5.0021    3.3781   -0.0276 H       1              0.0618
     33 H33        -4.9857   -1.8037    0.1999 H       1              0.0829
@<TRIPOS>BOND
    34    19    32    1
    35    20    33    1

@<TRIPOS>MOLECULE
NSC#1004
@<TRIPOS>ATOM
     24 H24         1.6496   -2.3122   -1.8334 H       1              0.2951
     25 H25         2.4525    4.9505    0.6430 H       1              0.2951
@<TRIPOS>BOND
    23    10    24    1
    24    12    25    1

@<TRIPOS>MOLECULE
NSC#1011
@<TRIPOS>ATOM
     45 H45         6.8310    4.1254   -1.1637 H       1              0.0633
     46 H46         2.1452   -3.8935   -5.5489 H       1              0.2954
@<TRIPOS>BOND
    48    26    45    1
    49    28    46    1
发表于 2003-9-15 22:37:42 | 显示全部楼层
1,先找出关键字所在的行号,
$grep -n "@<TRIPOS>MOLECULE" tmp
1<TRIPOS>MOLECULE
11<TRIPOS>MOLECULE
20<TRIPOS>MOLECULE
2,用简单的sed就可以找出第一个模式到第二个模式,和第二个模式到第三个模式的内容
$sed -ne '1,11p' -ne '11,20p' tmp
 楼主| 发表于 2003-9-15 23:21:44 | 显示全部楼层
可是那只是其中的一小部分,我是想利用其中的空行可以分割,不知道该怎么实现
发表于 2003-9-15 23:39:49 | 显示全部楼层
你的意思是把一个大文件,按空行和空行之间的内容分成若干个小文件?
 楼主| 发表于 2003-9-16 00:23:21 | 显示全部楼层
就是这个意思
发表于 2003-9-16 00:26:36 | 显示全部楼层
最初由 photofox 发表
就是这个意思

我想想.....:ask
发表于 2003-9-16 00:49:33 | 显示全部楼层
  1. #!/bin/ksh
  2. #scriptname:split file
  3. #writed by :javalee
  4. #date:2003/09/16
  5. #begin
  6. (($#!=1))&&{ echo "Usage:$0 filename";exit 1; }
  7. if [[ ! -f $1 ]]
  8.         then echo "$1 doesn't exits";exit
  9. fi
  10. n=1;m=1
  11. cat $1|while read i
  12. do
  13.         echo $i>>file$n
  14.         if [[ $i = "" ]]
  15.         then ((m+=1));((n+=1))
  16.         fi
  17. done
  18. echo "Created file:\n$(ls file*)"
  19. #end
复制代码
 楼主| 发表于 2003-9-16 09:33:44 | 显示全部楼层
if [[ $i = "" ]]
这个好像不能匹配空行,用if (length ($line) <2)倒可以,可我好像记得空行有一个特殊字符匹配的,是不是\s啊?
发表于 2003-9-16 10:56:22 | 显示全部楼层
最初由 photofox 发表
if [[ $i = "" ]]
这个好像不能匹配空行,用if (length ($line) <2)倒可以,可我好像记得空行有一个特殊字符匹配的,是不是\s啊?

if (length ($line) <2) 这是什么用法????
我觉得:if [[ ${#line} = 0 ]],应该可以检测变量的长度!
实验证明:
[/home/javalee/myshell]slipt tmp
Created file:
file1
file2
file3
[/home/javalee/myshell]cat file1
@<TRIPOS>MOLECULE
NSC#479
@<TRIPOS>ATOM
31 H31 -3.1419 -3.4336 0.1147 H 1 0.0633
32 H32 5.0021 3.3781 -0.0276 H 1 0.0618
33 H33 -4.9857 -1.8037 0.1999 H 1 0.0829
@<TRIPOS>BOND
34 19 32 1
35 20 33 1

[/home/javalee/myshell]cat file2
@<TRIPOS>MOLECULE
NSC#1004
@<TRIPOS>ATOM
24 H24 1.6496 -2.3122 -1.8334 H 1 0.2951
25 H25 2.4525 4.9505 0.6430 H 1 0.2951
@<TRIPOS>BOND
23 10 24 1
24 12 25 1

[/home/javalee/myshell]cat file3
@<TRIPOS>MOLECULE
NSC#1011
@<TRIPOS>ATOM
45 H45 6.8310 4.1254 -1.1637 H 1 0.0633
46 H46 2.1452 -3.8935 -5.5489 H 1 0.2954
@<TRIPOS>BOND
48 26 45 1
49 28 46 1

都是按照空行来匹配的!
发表于 2003-9-22 16:20:42 | 显示全部楼层
空行可以用正则表达式 ^$ 表示,即匹配行首和行尾连着
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表