设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 综合讨论区 —— LinuxSir.cn
›
shell进阶应用、shell编程
›
一个关于sed的使用,搞不定。请求帮助。 ...
返回列表
查看:
1094
|
回复:
7
一个关于sed的使用,搞不定。请求帮助。
[复制链接]
TualatriX
TualatriX
当前离线
积分
63
IP卡
狗仔卡
发表于 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
=================================================
呢?
在此请教高手,先谢了!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
jellychen
jellychen
当前离线
积分
126
IP卡
狗仔卡
发表于 2007-9-14 09:59:09
|
显示全部楼层
先用awk来做处理,分隔符为空行;
再用sed进行处理;
只是,我没有处理过汉字,所以没有这方面的经验!
回复
支持
反对
使用道具
举报
显身卡
yongjian
yongjian
当前离线
积分
2576
IP卡
狗仔卡
发表于 2007-9-14 17:07:50
|
显示全部楼层
if locale supports, shouldn't be a problem. the easiest way
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.
回复
支持
反对
使用道具
举报
显身卡
easydf
easydf
当前离线
积分
6
IP卡
狗仔卡
发表于 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
回复
支持
反对
使用道具
举报
显身卡
TualatriX
TualatriX
当前离线
积分
63
IP卡
狗仔卡
楼主
|
发表于 2007-9-14 19:05:15
|
显示全部楼层
感谢大家的帮助!
用easydf的方法把问题解决了。非常感谢!sed可以搞得这么复杂啊~我头都看晕了~~
用yongjian的方法的话,如果我想删除掉中间的那个“五笔拼音”的码表就不行了。不过还是谢谢。
回复
支持
反对
使用道具
举报
显身卡
pointer
pointer
当前离线
积分
496
IP卡
狗仔卡
发表于 2007-9-14 23:14:50
|
显示全部楼层
这个也可以
sed -n -e '/^\[码表\]/{
N;
/名称=五笔拼音/{b nop;}
: beg
/^ *$/!{p;n;b beg;}
p;
b out;
: nop
/^ *$/!{n;b nop;}
b out;
}
p;
:out' filename
复制代码
或者:
sed -n -e '/^\[码表\]/{N;h;}
x;
/\n名称=五笔拼音/!{x;p;g;}
/\n名称=五笔拼音/{x;}
' filename
复制代码
回复
支持
反对
使用道具
举报
显身卡
easydf
easydf
当前离线
积分
6
IP卡
狗仔卡
发表于 2007-9-15 14:11:54
|
显示全部楼层
佩服pointer的水平.....
用awk的话 可以这么做
awk 'BEGIN{
FS="\n";RS="";ORS="\n\n" }
/五笔字型/{
next
}
{print} ' filename
回复
支持
反对
使用道具
举报
显身卡
pointer
pointer
当前离线
积分
496
IP卡
狗仔卡
发表于 2007-9-15 17:02:38
|
显示全部楼层
我原来也想学awk的, 后来就学perl了
sed < awk << perl
或者sed就可以, 或者需要perl, 就想再多学点
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
Linux 程序设计专题讨论
Linux 基础讨论区(新手速成)
红旗 REDFLAG Linux
SuSE Linux
硬件设备 Linux 驱动
Slackware Linux
Redhat/Fedora/CentOS Linux
Linux发行版 Turbolinux专题
Ubuntu Linux 专题讨论
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表