LinuxSir.cn,穿越时空的Linuxsir!

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

sed 获取第一个匹配行

[复制链接]
发表于 2006-3-6 20:01:50 | 显示全部楼层 |阅读模式
sed -n -e '/^Subject/,/^From/p'
怎样才能获取第一个匹配的Subject与第一个From之间的段落,
发表于 2006-3-7 05:37:12 | 显示全部楼层
Post by biosedit
sed -n -e '/^Subject/,/^From/p'
怎样才能获取第一个匹配的Subject与第一个From之间的段落,

,试试这个:
  1. sed -n 'H;/^subject/h;/^form/{g;p;q}'
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-7 12:00:06 | 显示全部楼层
H,g道理还是一样的,
还是不能确定匹配哪一个From,
/^Subject/,/^From/{
/.*/p
/^From/q
}
这样可以,但只能截取第一封邮件,
回复 支持 反对

使用道具 举报

发表于 2006-3-8 00:45:51 | 显示全部楼层
我不知道具体格式,我想如果是

  1. Subject:alsdjkfie
  2. From:asliejf

  3. Subject:asleijfals
  4. From:lasjfieoeoqjfase
复制代码

我的命令可以给你抽出第一个匹配的Subject和From.就算Subject和From中间有其它行也行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-8 12:37:53 | 显示全部楼层
From:
第1封邮件的信息
Subject:邮件名
邮件

From:
第2封邮件的信息
Subject:第2封邮件邮件名
邮件

From:
第3封邮件的信息
Subject:。。。。。。。

截取第1个From到第2个From之间的内容,第1个From要,第2个From不要,
分别保存到以From后面的字段为文件名的文件,
如From:Sun Mar  5 21:09:49 2006,则保存为Sun Mar  5 21:09:49 2006,
回复 支持 反对

使用道具 举报

发表于 2006-3-8 13:49:05 | 显示全部楼层
Post by biosedit
From:
第1封邮件的信息
Subject:邮件名
邮件

From:
第2封邮件的信息
Subject:第2封邮件邮件名
邮件

From:
第3封邮件的信息
Subject:。。。。。。。

截取第1个From到第2个From之间的内容,第1个From要,第2个From不要,
分别保存到以From后面的字段为文件名的文件,
如From:Sun Mar  5 21:09:49 2006,则保存为Sun Mar  5 21:09:49 2006,

这可和你当初的要求不一样了。
  1. sed -n '{H;/^$/{x;p;q}}'
复制代码
试试这个吧。保存的部分我就没写了。
回复 支持 反对

使用道具 举报

发表于 2006-3-8 13:54:19 | 显示全部楼层
试试这个:

  1. #filename  getmail
  2. #!/bin/awk -f
  3. BEGIN{FS=":"; count=0; outfile="/dev/null"}
  4. {  if($1=="From")  {count=count+1; outfile=$2}
  5.     print $0 >> outfile
  6. }
复制代码

  1. ./getmail  mailname
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-8 14:19:21 | 显示全部楼层
Post by shizi4838
试试这个:

  1. #filename  getmail
  2. #!/bin/awk -f
  3. BEGIN{FS=":"; count=0; outfile="/dev/null"}
  4. {  if($1=="From")  {count=count+1; outfile=$2}
  5.     print $0 >> outfile
  6. }
复制代码

  1. ./getmail  mailname
复制代码

文件名截取的不对。
回复 支持 反对

使用道具 举报

发表于 2006-3-8 14:45:51 | 显示全部楼层
sorry ,我没看清文件名的格式,这样可以吗?
$more getmail

  1. #!/bin/awk -f
  2. BEGIN{FS=":"; count=0; outfile="/dev/null"}
  3. {  if($1=="From")  {count=count+1;
  4.                     match($0,"From:[ ]*")
  5.                     outfile=substr($0,RLENGTH+1)  
  6.                    }
  7.     print $0 >> outfile
  8. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-8 17:23:05 | 显示全部楼层
Post by yongjian
这可和你当初的要求不一样了。
  1. sed -n '{H;/^$/{x;p;q}}'
复制代码
试试这个吧。保存的部分我就没写了。

开始只想截取邮件,截取Subject到第1个From之间的内容,
再截取第2个Subject与From之间的内容,
但sed,似乎很难办到,sed不知道要匹配第几个From,
  1. sed -n '{H;/^$/{x;p;q}}'
复制代码

邮件当中如果有空行,就不行了,
回复 支持 反对

使用道具 举报

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

本版积分规则

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