sed & awk (2) 基础-sed 简介

来源:互联网 发布:dtmb软件下载 编辑:程序博客网 时间:2024/06/05 07:32

sed 与ed的区别:

1.sed基于字符流,ed是行编辑器;

2.sed非交互,ed是可以交互的编辑器;


Topic 1,sed脚本的多个命令是怎么作用于文件的?

文件

pig cow

pig

cow

cow pig

脚本

sed  -e 's/pig/cow/g' -e 's/cow/horse/g'

输出:

horse horse
horse
horse
horse horse

脚本:

sed -e 's/cow/horse/g'  -e 's/pig/cow/g'

输出

cow horse
cow
horse
horse cow

----

小伙伴们看出来了么?

其实是这样的:

“模式空间”:sed脚本每次只能处理文件的一行,首先拷贝这一行的副本,然后依次将所有命令作用这个副本(作用依次副本更新一次),

之后将副本输出到标准输出流。

那么上面两个脚本的顺序不同,结果也不同,前者先把pig换成cow,接着把cow换成horse,那么所有单词都变成horse了

后者避免了顺序可能导致的逻辑问题。


Topic 2 全局透视

sed 命令默认的全局范围是文件的所有行 如ed的(g/r/s/r/x/) cf    sed的(s/r/x/)

当然sed也可以手动指定范围:

sed  '/cow/s/pig/cow/g'   只有包含cow的行将pig换成cow


Topic 3 全局范围

3.1   “”,“” 分割

前者代表启动动作,后者代表禁用动作

e.g

2,4/d       #删除2-4行

1,/^$/d      #从第一行开始,直到第一个空行(包括该空行),全部删除


Topic 4 操作分组

1,$ {

/^$/d

s/a/b/g

}

操作可以用{}括起来,进行多组操作(注意{}里面的操作是sed的操作!独立包含操作的所有元素)

注:操作前带!可以反向


一个分组操作的例子

sed  '/<form/,/<\/form/!d' |\
sed -e '/<form /s/.*<form/<form/g' -e '/<\/form>/s/<\/form>.*/<\/form>/' |\
sed  '/<form/,/<\/form/{
    /^$/d    
   s/pig/cow/g 
}'

第一行提取了包含<form>标签的行(一行有多个form的情况后面没考虑)

第二行清理了<form之前的字符以及</form>之后的字符

第三行是一个分组:

删除空白行

将每行所有pig换成cow



Topic 4 n p共用 cf grep

-n 是指不用默认方式将sed命令输出到标准输出流

p操作是打印(-n不会影响p的输出)

那么

sed -n '/pig/,/cow/p'

打印从pig到cow的所有行

grep可不行


原创粉丝点击