LinuxSir.cn,穿越时空的Linuxsir!

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

一个关于sed的使用,搞不定。请求帮助。

[复制链接]
发表于 2007-9-13 22:51:28 | 显示全部楼层 |阅读模式
小弟在用sed流处理文本时遇到了一个问题,特别向大家请教。
这里以Fcitx的Table表为例:
================================================
#以#打头的为注释
[码表]
名称=五笔字型
码表=wbx.mb
调频=0
拼音=1
拼音键=z
自动上屏=-1
空码自动上屏=0
模糊=1
模糊键=z
自动词组=1
自动词组长度=4
词组参与自动造词=1
保存自动词组=0
精确匹配=0
提示编码=0
符号=zzzz

[码表]
名称=五笔拼音
码表=wbpy.mb
调频=2
拼音=0
自动上屏=-1
空码自动上屏=-1
自动词组=0
精确匹配=0
提示编码=0

[码表]
名称=二笔
码表=erbi.mb
调频=0
拼音=1
拼音键=[
自动上屏=-1
空码自动上屏=0
模糊=1
模糊键=?
自动词组=1
自动词组长度=4
词组参与自动造词=0
保存自动词组=0
精确匹配=0
提示编码=0
=================================================

我想通过执行一条命令来去掉某个码表,如二笔。用sed来弄,想把"名称=二笔"至空行的内容都通过sed去掉,但是余下一个多余的“[码表]”去不掉了。因为有多个“[码表]”的内容,sed流一遇到它,就会执行。这样就会影响其他码表了~

能不能通过执行一条或几条命令,让上述文本变成
================================================
#以#打头的为注释
[码表]
名称=五笔字型
码表=wbx.mb
调频=0
拼音=1
拼音键=z
自动上屏=-1
空码自动上屏=0
模糊=1
模糊键=z
自动词组=1
自动词组长度=4
词组参与自动造词=1
保存自动词组=0
精确匹配=0
提示编码=0
符号=zzzz

[码表]
名称=五笔拼音
码表=wbpy.mb
调频=2
拼音=0
自动上屏=-1
空码自动上屏=-1
自动词组=0
精确匹配=0
提示编码=0
=================================================
呢?

在此请教高手,先谢了!
发表于 2007-9-14 09:59:09 | 显示全部楼层
先用awk来做处理,分隔符为空行;
再用sed进行处理;
只是,我没有处理过汉字,所以没有这方面的经验!
回复 支持 反对

使用道具 举报

发表于 2007-9-14 17:07:50 | 显示全部楼层
if locale supports, shouldn't be a problem. the easiest way
  1. cat file | sed '/二笔/,$d' | sed '$d'
复制代码
Since the first process reach the EOF, you can't have sed turned back, so just pipe another one.
回复 支持 反对

使用道具 举报

发表于 2007-9-14 18:55:07 | 显示全部楼层
#!/bin/bash
#1.sh
line="$(tail -1 $1)"
[[ $line != "" ]] && echo "" >>$1

sed  '
/名称=五笔拼音/,/^$/d
' $1 |sed '
/\[码表\]/{
N
s/\[码表\]\n\[码表\]/\[码表\]/
}' |sed '$d'

./1.sh  file
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-14 19:05:15 | 显示全部楼层
感谢大家的帮助!

用easydf的方法把问题解决了。非常感谢!sed可以搞得这么复杂啊~我头都看晕了~~
用yongjian的方法的话,如果我想删除掉中间的那个“五笔拼音”的码表就不行了。不过还是谢谢。
回复 支持 反对

使用道具 举报

发表于 2007-9-14 23:14:50 | 显示全部楼层
这个也可以
  1. sed -n -e '/^\[码表\]/{
  2. N;
  3. /名称=五笔拼音/{b nop;}
  4. : beg
  5. /^ *$/!{p;n;b beg;}
  6. p;
  7. b out;
  8. : nop
  9. /^ *$/!{n;b nop;}
  10. b out;
  11. }
  12. p;
  13. :out' filename
复制代码

或者:
  1. sed -n -e '/^\[码表\]/{N;h;}
  2. x;
  3. /\n名称=五笔拼音/!{x;p;g;}
  4. /\n名称=五笔拼音/{x;}
  5. ' filename
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-9-15 14:11:54 | 显示全部楼层
佩服pointer的水平.....
用awk的话 可以这么做

awk 'BEGIN{
FS="\n";RS="";ORS="\n\n" }
/五笔字型/{
next
}
{print} '  filename
回复 支持 反对

使用道具 举报

发表于 2007-9-15 17:02:38 | 显示全部楼层
我原来也想学awk的, 后来就学perl了
sed < awk << perl

或者sed就可以, 或者需要perl, 就想再多学点
回复 支持 反对

使用道具 举报

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

本版积分规则

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