LinuxSir.cn,穿越时空的Linuxsir!

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

请教如何处理字符串?

[复制链接]
发表于 2007-1-31 15:46:50 | 显示全部楼层 |阅读模式
现有这样的文件:
    12 OCT 2006; Jcake willer <jacke_willer@163.com> libdeiododng-1.2.3.-r1.ebuild
   added new information in  this ebuild.
    20 DEV 2006; Miachel Jordan <miachel_jordan@gmail.com> app-pda-2.1.10-r1.ebuild
   modified some information in this ebuild.
    ..........
    其中上面的每条信息可能占用不止一行.
   我想处理一下这些信息,就是把他们前面都加上相应的字段说明,即,下面的形式:
    Develope time: 12 OCT 2006; Developer: Jcake willer; Email:<jacke_willer@163.com>; Product:libdeiododng-1.2.3.-r1.ebuild
每条信息下面的说明就不需要.
   由于正则表达式等实在用的不熟,所以这个信息还是不能很好的处理,希望指教,谢谢
发表于 2007-3-2 23:53:36 | 显示全部楼层
Sorry,没看清楚,再看看呵呵
回复 支持 反对

使用道具 举报

发表于 2007-3-3 19:42:44 | 显示全部楼层
脚本test.sh的内容如下:

  1. #!/bin/sh

  2. cat $1 | while read line
  3. do
  4.         #用grep查找是否该行需要修改:
  5.         echo "$line" | grep -qs "[0-9] [A-Z][A-Z][A-Z] [0-9][0-9][0-9][0-9];.*<.*@.*\..*> "
  6.         if [ $? -eq 0 ]; then
  7.                 time=$(echo $line | awk -F"[;<>]" '{print $1}')
  8.                 name=$(echo $line | awk -F"[;<>]" '{print $2}')
  9.                 email=$(echo $line | awk -F"[;<>]" '{print $3}')
  10.                 software=$(echo $line | awk -F"[;<>]" '{print $4}')

  11.                 # 删除前后多余的空格,取决于是否对格式有严格要求,这四行也许是多余的
  12.                 time=$(echo $time)
  13.                 name=$(echo $name)
  14.                 email=$(echo $email)
  15.                 software=$(echo $software)

  16.                 #输出
  17.                 echo -n "Develop time: $time; "
  18.                 echo -n "Developer: $name; "
  19.                 echo -n "email:<$email>; "
  20.                 echo "Product:$software"

  21.         # 如果要保留那些无关信息,则将以下两行的"#"符号删除
  22.         #else
  23.         #       echo $line
  24.         fi
  25. done
复制代码

用法: ./test.sh file1 > file2
回复 支持 反对

使用道具 举报

发表于 2007-3-3 19:47:27 | 显示全部楼层
   发完上帖才发现是在python版...
这个shell版先放这了,什么时候学一下python的re, 再来修改!
回复 支持 反对

使用道具 举报

发表于 2007-3-3 20:16:55 | 显示全部楼层
正则还是要用Perl.......

[php]
[0 No.2081 huan@huan ~/tmp]$ cat foo
12 OCT 2006; Jcake willer <jacke_willer@163.com> libdeiododng-1.2.3.-r1.ebuild
added new information in this ebuild.
20 DEV 2006; Miachel Jordan <miachel_jordan@gmail.com> app-pda-2.1.10-r1.ebuild
modified some information in this ebuild.

[0 No.2082 huan@huan ~/tmp]$ perl -lne 'if ( /(^.*); ([^<]+) <(\S+)> (\S+)$/ ) {
print "Develope time: $1; Developer: $2; Email:<$3>; Product: $4" }' < foo
Develope time: 12 OCT 2006; Developer: Jcake willer; Email:<jacke_willer@163.com>; Product: libdeiododng-1.2.3.-r1.ebuild
Develope time: 20 DEV 2006; Developer: Miachel Jordan; Email:<miachel_jordan@gmail.com>; Product: app-pda-2.1.10-r1.ebuild

[0 No.2083 huan@huan ~/tmp]$

[/php]
回复 支持 反对

使用道具 举报

发表于 2007-3-3 20:18:33 | 显示全部楼层
不过,Develope 这词不对吧,呵
回复 支持 反对

使用道具 举报

发表于 2007-3-3 21:00:02 | 显示全部楼层
受huan的启发,这是sed版本:   *_*
  1. sed -n 's/\([0-9]* [A-Z]* [0-9]*;\)\(.*\)\(<.*@.*\..*>\)\(.*\)/Develop time:\1 Developer:\2 Email:\3 Product: \4/p' file1 > file2
复制代码
如果要保留无关信息, 则将 sed -n 's/..../p'  改为 sed 's/..../' 即可。
回复 支持 反对

使用道具 举报

发表于 2007-3-3 23:19:34 | 显示全部楼层
感觉 sed 处理是比较简洁的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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