Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103564
  • 博文数量: 7
  • 博客积分: 1430
  • 博客等级: 上尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-12 00:17
文章分类

全部博文(7)

文章存档

2008年(7)

我的朋友
最近访客

分类:

2008-04-24 21:41:15

sed缓冲区
sed 处理文件时,会把文件的每一行保存在一个临时缓冲区,即模式空间。
sed处理完一行后,该模式空间就被清空,下一行等待处理。因此可把模式空间内容用命令h复制并
保存在一个暂存缓冲区(holding buffer)内,然后可用命令G把它从暂存缓冲区读出一行,并放回模式空间缓冲区,
追加在模式空间内当前行的后面。

**sed执行过程:
   a. 如果已到达文件尾,goto e;否则,用当前行内容替换模式空间的内容(即缓冲区,还有一个缓冲区:后备空间);
   b. 执行命令序列,命令只对模式空间有效;
   c. 当前行号加1
   d. goto a;
   e. 退出
注: 当前行号可由命令N或n更改,当前行号最初为第1行
    执行命令时,如果该命令有地址前缀,那么看*当前行号*是否与地址前缀相符,相符则执行,否则不执行
    
    
**选项:
-V
--version
          提示版本信息
-h
--help
          提示帮助信息
-n
--quite
--silent
          默认情形,sed在执行完用户提交的命令列表后,会执行p命令,这3个选项能屏蔽这个默认功能
-e
--exception=script
          增加script命令列表到当前命令列表
-f
--file=script-file
          增加script-file文件内的命令列表到当前命令列表
初始时,当前命令列表为空;如果没有-e,--exception,-f,--file选项,那么命令行的第一个非选项参数被
当作命令列表添加到当前命令列表中


**常见命令:
可带范围地址前缀的命令(11个):
d         删除模式空间的内容,goto c
D         删除模式空间内的第一行,如果模式空间内还有内容,goto b,否则,goto c
p         将模式空间中的内容输出到标准输出
P         将模式空间中的第一行内容输出到标准输出
N         读入下一行,将其*追加*到模式空间尾,当前行号加1,如果没有可读的行了,goto e
n         读入下一行,用它*替换*模式空间内容,当前行好加1,如果没有可读的行了,goto e
h         用模式空间内容*替换*后备空间内容
H         将模式空键内容*追加*到后备空间尾
g/G       同h/H,但方向相反,后备空间->模式空间
x         交换模式空间和后备空间内容
l         输出模式空间内容到标准输出,以更人性话的方式输出
=                显示文件行号
a\               在定位行号后附加新文本信息
i\               在定位行号后插入新文本信息
c\               用新文本替换定位文本
s                 使用替换模式替换相应模式
r                 从另一个文件中读文本
w                 写文本到一个文件
q                 第一个模式匹配完成后推出或立即退出
{ }             在定位行执行的命令组




1.  sed -n 'row_number,/pattern/p' FILE_NAME; #如果在该行匹配到pattern就显示该行及以下所有行的,如果没匹配,则显示该行到以下第一个匹配行间所有行
2.  sed -n '1,$p' FILE_NAME; #显示第一行到最后一行的所有内容
        sed -n '/^$/p' FILE_NAME; #显示空行
3.  sed -n '/pattern/=' FILE_NAME; #打印所有行,匹配行打印行数,不打印内容
    * sed -e '/pattern/=' FILE_NAME; #打印匹配行打印行数,不打印内容
      sed -e '/pattern/=' -n -e '/pattern/p' FILE_NAME; #打印匹配行数及该行的内容,要用2个sed命令,一个显示行号,一个显示内容
      sed -n -e '=;p' FILE_NAME; #给所有行加行号
4.  sed '/pattern/a\#append_content#' FILE_NAME; #注意#append_content#替换成自己要的内容,并把内容附加在匹配行的下一行,#append_content#中可以用'\'来进行换行
      sed '/pattern/i\#append_content#' FILE_NAME; #注意#append_content#替换成自己要的内容,并把内容附加在匹配行的上一行,#append_content#中可以用'\'来进行换行
5.  sed '/pattern/c\#replace_content#' FILE_NAME; #将匹配行置换成#replace_content#内容
6.  sed '/pattern/d' FILE_NAME; #删除匹配行
7.  sed 's/pattern/#replace_word#/' FILE_NAME; #将匹配到的字符串替换成#replace_word#内容,注意和第5点的区别,每行只替换第一个匹配到的
      sed 's/pattern/#replace_word#/g' FILE_NAME; #将匹配到的字符串替换成#replace_word#内容,替换所有匹配到的
  * sed 's/pattern/#replace_word#/w another_file' FILE_NAME; #将匹配到的内容置换后,输出到another_file(只输出匹配行)
      sed -n 's/pattern/#replace_word#/p' FILE_NAME>another_file; #效果同上,如果不加p, 则输出空到another_file
    * sed -n 's/pattern/#some_words# &/p' FILE_NAME;  #使用替换修改字符串,这里‘&’代表前面匹配到的字符串,然后在该字符串前加#some_words#,当然也可以在其后。。
8.  sed '/pattern/r another_file' FILE_NAME; #从another_file中读入内容,把内容加在匹配行的下一行
9.  sed '/pattern/q' FILE_NAME; #匹配到第一个即退出,不再匹配后面

注:
1. 删除模式 (/pattern/d)删除匹配字符所在的行,如果要删除匹配到的字符,则要用替换模式(s/pattern//g)
2. 如果要用shell变量,那必须要用双引号
    例:rep_word="replace it";
            sed "s/#replace_word#/$rep_word/g" FILE_NAME;
3. echo "account"|sed 's/$/&.doc/g'  # ‘$’代表传入的值
4. sed中-n和p成对出现时表示显示比配到的行,-e用来指定多个不同的命令,如上面的3.3例
5. 替换模式 s/// 只是一个命令,它没有指定所作用的行(默认是全文本),所以我们可以指定行
   sed '1,20s/word1/word2/g' FILE_NAME; #作用范围1~20行
   sed '/^$/,/^END/s/word1/word2/g' FILE_NAME; #作用范围,空行到END开头的行
6. s///模式还可以指定分隔符 sed 's:word1:word2:g' FILE_NAME;  #现在是以:为分隔符
7. 如果要删除

aabbcc

中的html标签p,我们尝试
     sed 's/<.*>//g' FILE_NAME; #这样的效果是删除了整个

aabbcc

,因为sed是匹配最长字符串的,
     如果要达到预期效果,我们必须
     sed 's/<[^>]*>//g' FILE_NAME; #指定<和>之间是非>的任意多个任意字符
8. 指定区域 sed 's/\(.*\) \(.*\) \(.*\)/word1 \1 word2 \2 word3/' FILE_NAME; #以空格为间隙,把行分为3个部分,每个部分的调用可以用\n来实现
阅读(1068) | 评论(0) | 转发(0) |
0

上一篇:通过几个例子看sed的模式空间与保持空间

下一篇:没有了

给主人留下些什么吧!~~