• RSS订阅
  • 交换链接
  • 首页

Jeffrey’s Blog

Web&P2P系统架构及优化


sed学习笔记

February 7th, 2007

作者: Jeffrey
出处:http://blog.zhangjianfeng.com/?p=532

++sed 编辑指令的格式如下 :
[address1[,address2]]function[argument]
#address1/2可为行数或regular expression, 函数参数 function[argument] 为 sed 的内定函数
#/apple/,/orange/d 表示删除含有 "apple" 至 "orange" 字符串的数据行

++函数参数 功能列表
: label  建立 script file 内指令互相参考的位置。  
#  建立批注  
{ }  集合有相同位址参数的指令。  
!  不执行函数参数。  
=  印出资料行数( line number )。  
a\  添加使用者输入的数据。  
b label  将执行的指令跳至由 : 建立的参考位置。  
c\  以使用者输入的数据取代数据。
d  删除数据。  
D  删除 pattern space 内第一个 newline 字母 \ 前的数据。  
g  拷贝数据从 hold space。  
G  添加资料从 hold space 至 pattern space 。  
h  拷贝数据从 pattern space 至 hold space 。  
H  添加资料从 pattern space 至 hold space 。  
l  印出 l 资料中的 nonprinting character 用 ASCII 码。  
i\  插入添加使用者输入的数据行。  
n  读入下一笔资料。  
N  添加下一笔资料到 pattern space。  
p  印出资料。  
P  印出 pattern space 内第一个 newline 字母 \ 前的数据。  
q  跳出 sed 编辑。  
r  读入它檔内容。  
s  替换字符串。  
t label  先执行一替换的编辑指令 , 如果替换成牛p>则将编辑指令跳至 : label 处执行。  
w  写资料到它文件内。  
x  交换 hold space 与 pattern space 内容。  
y  转换(transform)字符。  

++ 函数参数 s 表示替换(substitute)文件内字符串。其指令格式如下 :
[address1[ ,address2]] s/pattern/replacemen/[flag]
#flag : 主要用它来控制一些替换情况 :
当 flag 为 g 时 , 代表替换所有符合(match)的字符串 。
当 flag 为十进制数 m 时 , 代表替换行内第 m 个符合的字符串。
当 flag 为 p 时 , 代表替换第一个符合 pattern 的字符串后 , 将数据输出标准输出文件。
当 flag 为 w wfile 时 , 代表替换第一个符合 pattern 的字符串后 , 输出到 wfile 檔内(如果 wfile 不存在 , 则会重新开启名为 wfile 的档案)。
#数据文件的 "test" 被替换成 "test my car"
sed -e 's/test/& my car/' filename  ## &:代表其前 pattern 字符串
#数据文件的 "test my car" 被替换成 "[my car test]"
sed -e  's/\(test\) \(my\) \(car\)/[\2 \3 \1]/' filename #\n代表pattern中被第 n 个 \(XX\)所括起来的字符串

++参数 p 可以显示符合条件行
sed -n '1p;5p' filename #显示filename的第1行和第5行
sed -n '1p,5p' filename #显示filename的第1行到第5行
sed -n '/中国人/p' filename #显示filename中所有含有"中国人"字段的行

++函数参数 d 表示删除数据行 , 其指令格式如下:
[address1[ ,address2]] d

++函数参数 a 表示将资料添加到文件中。其指令格式如下:
[address1] a\  使用者所输入的数据
sed -e '/美国人/a\中国人' filename #添加 "中国人" 在含 "美国人" 字符串的数据行后
#如果需要插入多行,可以加\n    

++函数参数 i 表示将资料插入文件中。其指令格式如下:
[address1] i\  使用者所输入的数据
sed -e '/美国人/i\中国人' filename #添加 "中国人" 在含 "美国人" 字符串的数据行前

++函数参数 c 表示将以使用者输入的数据取代数据。其指令格式如下:
[address1] c\  使用者所输入的数据
sed -e '/美国人/c\中国人' filename #将 "中国人" 所在行数据更换为 "美国人" 字符串

++&可以在行内替换指定关键字
sed -e 's/美国人/中国人/' filename #将 "中国人" 所在行中,"中国人"更换为 "美国人"

++函数参数 r 表示读入它档案内容到檔中。其指令格式如下 :
[address1] r 它檔名称
sed '/美国人/r otherfile/' filename #将otherfile文件内容附加到所有含"美国人"行的下面

++函数参数 w 表示将檔中的写到它檔内。其指令格式如下 :

[address1[ ,address2]] w 它檔名称

++函数参数 y 表示转换数据中的字符。其指令格式如下 :
[address1[ ,address2]]y /xyz…/abc…/
#其中 abc… 与 xyz… 的字符个数必须相同,a字符转换成x字符、b转成y、c转成z…
sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' input.dat #字母大小的转换。

++函数参数 ! 表示不执行函数参数。当有如下指令时 ,
[address1[ , address2]] ! 函数参数
sed -e '/1996/!d' input.dat  #删除 除了含 "1996" 字符串外的所有行

++参数n表示读入下一行资料。其指令格式如下:
[address1[ ,address2]] n
sed -n -e 'n' -e 'p' infro.dat #输出 input.dat 文件内偶数行资料

++函数参数 q 表示跳离 sed 。其指令格式如下:
[address1] q

++函数参数 = 表示印出资料的行数。其指令格式如下:
[address1 ,[address2]] =
sed -e '=' input.dat   #印出资料的行数

++ 函数参数#后的文字为注解,当注解超过多行时,其行间须以"\"换行字符相隔

++函数参数 N 表示添加下一笔资料在 pattern space 内。其指令格式如下:
[address1 ,[address2]] N
#将下述两行数据合并。假设 input.dat 的内容如下 :
#The UNIX
#Operating System
sed -e 'N' -e 's/\n/ /' input.dat

++函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下:
[address1,address2]D
#函数参数 D 与 d 的比较如下 :
当 pattern space 内只有一数据行时 , D 与 d 作用相同。
当 pattern space 内有多行资料行时
D 表示只删除 pattern space 内第一行资料 ; d 则全删除。
D 表示执行删除后 , pattern space 内不添加下一笔数据 , 而将剩下的数据重新执行 sed script ; d 则读入下一行后执行 sed script。

++函数参数 P 表示印出 pattern space 内的第一行资料。其指令格式如下:
[address1,address2] P

++输出 input.dat 文件内奇数行资料。假设 input.dat 檔内容如下:
#The
#UNIX
#System
sed -n -e 'N' -e 'P' infro.dat
#说明: 在命令列上
#以选项 -n , 将数据输出的控制权(参照[section2.5])转给指令。
#利用函数参数 N 将偶数行添加至 pattern space 内奇数行后。
#利用函数参数 P 将 pattern space 内的第一行(奇数行)输出。
#在奇数行输出后 , pattern space 内剩下的数据行(偶数行)则被放弃输出。最后 , 整个输出只有原先的奇数行数据。

++函数参数 h 表示暂存 pattern space 的资料至 hold space。其指令格式如下:
[address1 ,[address2]] h
#函数参数H与h唯一差别是,sed执行h时,数据盖掉(overwrite) hold space内原来的数据,而H,数据则是"添加(append)"在 hold space 原来数据后.

++函数参数 g 表示与函数参数 h 相反的动作 , 它表示将 hold space 内资料放回 pattern space 内。其指令格式如下 :
[address1,address2]g
#函数参数G与g唯一差别是,sed 执行g时,数据盖掉(overwrite) pattern space内原来的数据,而G,数据则是"添加(append)"在 pattern space原来数据后.

++函数参数 x 表示交换 hold space 与 pattern space 内的数据。其指令格式如下 :
[address1 ,[address2]] x
sed -e '1h' -e '3x' input.dat   #将 input.dat 文件内第 1 行资料取代第 3 行资料
#以函数参数 h 将第 1 资料存入 hold space ; 当第 3 行数据出现在 pattern space , 以函数参数 x 交换 hold space 与 pattern space 的内容。如此 , 第 3 行资料就被第 1 资料替代。

++ b、:label
函数参数 : 与函数参数 b 可在 sed script 内建立类似 BASIC 语言中 GOTO 指令的功能。其中 , 函数参数 : 建立标记;函数参数 b 将下一个执行的指令 branch 到标记处执行。函数参数 : 与 b , 在 script file 内配合的情况如下
      编辑指令m1
      :记号
      编辑指令m2
      [address1,[address2]]b [记号]
其中 , 当 sed 执行至指令 [address1,[address2]]b [记号] 时 , 如 pattern space 内的数据符合地址参数 , 则 sed 将下一个执行的位置 branch 至由 :记号(批注[14])设定的标记处 , 也就是再由 "编辑指令m2" … 执行。另外 , 如果指令中函数参数 b 后没有记号 , 则 sed 将下一个执行的指令 branch 到 script file 的最后 , 利用此可使 sed script 内有类似 C 语言中的 case statement 结构。
#将 input.dat 文件内数据行的开头字母重复印 40 次。假设 input.dat 檔的内容如下 :
A
B
C
#sed 命令列如下 :
sed -e '{
:p1
/A/s/A/AA/
/B/s/B/BB/
/C/s/C/CC/
/[ABC]\{40\}/b
b p1
}' input.dat

++基本上 , 函数参数 t 与 函数参数 b 的功能类似 , 除了在执行 t 的 branch 前 , 会先去测试其前的替换指令有没有执行替换成功外。在 script file 内的情况如下:
       编辑指令m1
       :记号
       编辑指令m2
       s/…/…/
       [address1,[address2]]t [记号]
       编辑指令m3
其中 , 与函数参数 b 不同处在于 , 执行函数参数 t branch 时 , 会先检查其前一个替换指令成功与否。如成功 , 则执行 branch ; 不成功 , 则不 branch , 而继续执行下一个编辑指令
##将 input.dat 文件中资料 A1 替换成 C1、C1 替换成 B1、B1 替换成 A1。input.dat 檔的内容如下:
代号
B1
A1
B1
C1
A1
C1
说明 : input.dat 文件中全部数据行只需要执行一次替换动作 , 但为避免数据被替换多次 , 所以利用函数参数 t 在 sed script 内形成一类似 C 语言中 case statement 结构 , 使每行数据替换一次后能立即用函数参数 t 跳离替换编辑。
sed 命令列 :
sed -e '{
s/A1/C1/
t
s/C1/B1/
t
s/B1/A1/
t
}' input.dat

++常用的 regular expression
普通字符  由普通字符所组成的 regular expression 其意义与原字符串字面意义相同。  
^字符串  限制字符串必须出现于行首 。
$字符串  限制字符串必须出现行尾。  
.  表示任意一字符。
[…]  字符集合, 用以表示两中括号间所有字符当中的任一个 ,如 [^…]表示两中括号间所有字符以外的字符。
-&  字符集合中可用"&"指定字符的范围。  
*  用以形容其前的字符(或字符集合)可重复任意多次 。
\n  表示嵌入新行字符(imbedded new line character)。  
\(…\)  于 regular expression 中使用"\(" "\)"来括住一部份的 regular expression ; 其后可用"\1"来表示第一个被"\(" "\)"括住的部份。若 regular expression 中使用数次的"\(" "\)"来括住不同的部份 , 则依次使用"\1","\2","\3",…(最多可到"\9")。

Last modified at: Wednesday, October 24th, 2007 03:42:01 am
Trackback URL: http://blog.zhangjianfeng.com/article/532/trackback

给本文打分: 1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
Tags: sed, 学习, 笔记
2007/02/7 | 阅读全文 | 电脑网络, 系统管理 | Email This Post | Print This Post | 1,154 views |
收藏到网摘: Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网

Related Post

  • Saturday, December 22nd, 2007 -- suse 学习笔记
  • Wednesday, September 12th, 2007 -- iptables学习笔记
  • Wednesday, June 6th, 2007 -- oracle学习笔记
  • Monday, April 16th, 2007 -- Legato networker学习笔记(杂)
  • Monday, February 5th, 2007 -- squid安装配置笔记(反向代理)
  • Saturday, December 23rd, 2006 -- apache学习笔记
  • Friday, December 22nd, 2006 -- FreeBSD6.1学习笔记
  • Thursday, July 20th, 2006 -- DNS与BIND学习笔记
  • Tuesday, June 24th, 2008 -- oracle一次数据迁移笔记
  • Friday, June 6th, 2008 -- xen安装及配置笔记

0 Responses to “sed学习笔记”


  1. No Comments

Leave a Reply

  • :em04:
  • :em18:
  • :em17:
  • :em10:
  • :em01:
  • :em05:
  • :em15:
  • :em07:
  • :em03:
  • :em13:
  • :em09:
  • :em12:
  • :em11:
  • :em06:
  • :em16:
  • :em14:
  • :em02:
  • :em08:

« squid安装配置笔记(反向代理)
SATA、SAS和FC-AL主要特性对比 »

    最新文章

    • Subversion的用户自助修改口令实现(linux测试通过)
    • SLES10-SP1+Apache-2.0.63+SVN-1.4.6安装配置笔记
    • [音乐欣赏]A place nearby
    • 不错的firefox插件---鼠标手势mouse gestures
    • 一些相克食品
    • oracle一次数据迁移笔记
    • 不错的vi-vim键盘图(中英文双版)
    • xen安装及配置笔记
    • Multiple network cards and bridges in Xen[zz]
    • 从LiveJournal后台发展看大规模网站性能优化方法[zz]

    评分最高文章

      • 今天下载的一个CHM文件,打开时右边的内容看不到,提示“该页无法显示”。
      • linux日志服务器配置笔记
      • Legato networker学习笔记(杂)
      • linux tips 技巧笔记
      • [BT下载]2006韩剧-葡萄园的那小伙儿
      • 我家的金吉拉
      • 卡巴斯基病毒库离线更新方法
      • 忽悠姐妹花主题曲下载
      • 轻轻松松把 Apache 配置安全
      • 北京IDC机房介绍

    随机文章:

    • 住房公积金将可自行申办,单位不为职工办理的,下月起职工可自行申办
    • RedHat Enterprise Linux在IBM System x服务器上的调优(三)
    • StatTraq的summary页面的中文显示乱� �问题
    • NetScreen防火墙中文说明文档
    • 一些相克食品
    • Linux日志文件系统及性能分析
    • 手动删除 SharePoint Portal Server
    • /目录空间不足,清理/var/log/audit.d
    • 10060错误解决办法
    • 引导加载程序之争:了解 LILO 和 GRUB

    最新评论

    • very good :em02: ,I like very much !!...
    • :em03: :em13: :em15: :em07...
    • 北京电信通有四个机房1惠普机房 2中...
    • :em04: :em18: :em17...
    • 结婚的好日子啊8月10...
    • c2950-1-1(config)# snmp-server trap-source FastEt...
    • :em16: :em16: :em16: :em16: :em16: :em16: :...
    • :em01: :em07: :em04: :em17: :em10: :em18: :...
    • 我是天称座 :em14: :em15: :em03: :em02: :...
    • [...] 前面一段:1.3.6.1.4.1. 可以查看这...


    邮件订阅  
  • Categories

    • 个人日志 (15)
    • 休闲娱乐 (79)
    • 应用服务 (86)
    • 影音娱乐 (10)
    • 电脑网络 (78)
    • 站点日志 (19)
    • 系统管理 (242)
    • 英语学习 (15)
    • 衣食住行 (41)
    • 资料共享 (28)
  • 工具网址

    • 天气预报
    • 常用电话
    • 疾病查询
    • 在线翻译
    • Alexa排名查询
    • IP信息查询
    • 邮箱图标生成
    • 我的Firefox插件
  • 友情链接

    • linuxの飘扬
    • winter的平凡生活
    • 伤感星星的天空
    • 回忆未来[张宴]
    • 存储部落
    • 扶凯Blog
    • 沐宇春风
    • 爱MySQL中文网
    • 狗.车.志
    • 非礼勿视
  • Tags

    • 下载 优化 使用 免费 北京 升级 学习 学习笔记 安装 工具 技巧 日志 最新 服务器 笔记 英语学习 菜谱 视频 解决 调优 软件 运程 配置 配置文件 食物 2007 apache blog dreamhost freebsd Legato linux mysql networker oracle php RAID5 RedHat sendmail shell squid suse Ubuntu windows wordpress

Jeffrey's Blog is powered by WordPress 2.3.1 and Unnamed 1.22
Entries (RSS) and Comments (RSS) Admin 京ICP备06038449号

Podcast Powered by podPress (v8.8)