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可不行