一、介绍
Sed是一种非交互式的流编辑器(Stream Editor),可动态编辑文件。所谓非交互式是说,sed和传统的文本编辑器(如Vi、Emacs)不同,并非和使用者直接交互,sed处理的对象是文件的数据流,sed从文本的一个文本行或者标准输入读取数据,将其复制到缓冲区,然后读取命令行或者脚本的第一个命令,对缓冲区中的数据进行操作,所以sed是不会改变源文件中的任何内容。sed的工作模式是对每一行数据,若符合指定的样式,就执行相应的操作。
二、使用场景
- 编辑相对交互式文本而言较大的文件;
- 编辑命令太复杂,在交互式文本中难以输入;
- 对文件扫描一片,但需要进行多个编辑函数的情况;
三、使用方式
1、可以直接在命令行使用sed命令,命令格式如下:
sed [选项] 'sed命令' 输入文件2、可以想shell脚本一样,把sed命令写入脚本,然后执行脚本
四、选项和sed命令
上述使用方式1中,sed命令可以继续分成:定位文本行+sed编辑命令
其中,定位文本行可以直接指定行号或者根据正则表达式进行模式匹配出相应的行号
sed的常用编辑命令较多,也正是编辑命令的多样性才有其多种编辑功能
五、一组例子
1.命令选项 -n
第一条命令显示temp.txt内容
第二条命令是不加-n选项的情况下打印第2行的内容,其中2是定位方式,p是编辑命令,可见实际打印了第二行和所有行
第三条命令加了-n选项,只打印第二行
2、命令选项-e
不加-e选项的时候编辑命令是不可以直接放在一起执行的,如,要打印第二个行,也要打印模式"orange"所在的行号,下述语句是错误的
sed -n '2p,/orange/=' temp.txt为了能够扫描一片文本完成多个编辑命令可以有三种方式
方式一就是使用-e选项,完成上述功能只需要这样输入
sed -n -e '2p' -e '/orange/=' temp.txt
方式二,使用分号隔开命令
sed -n '2p;/orange/=' temp.txt 方式三,使用{}构成命令组
sed -n '{2p;/orange/=;}' temp.txt
3、命令选项-f
当使用sed脚本的时候,如,在上述temp.txt文本中orange所在行后加上一句,可以使用a\编辑命令
命令1是脚本append.sed的内容,脚本的第一行同shell脚本指定执行程序,第二行是sed命令,在模式orange后追加第三行语句
命令2改变脚本权限,使之可执行
命令3执行脚本,注意仍需要加上源文件temp.txt
下面给出几个编辑命令的例子
1.编辑命令i/和c/
这两个同追加编辑命令a/,只不过i/是在定位行之前插入,c/则把定位行给修改成给定的文本,可以直接把上述append.sed脚本中a/改成i/或c/进行实验。
2.编辑命令删除文本d和替换文本s命令
第2条命令删除2~4行的内容
第3条命令把apple替换成APPLE,和第4条格式一样,与第5条的差别是加上编辑命令g(global)之后,会对全局的模式进行匹配,不加只会匹配到每行第一个
3.编辑命令保存到文件w
sed是对缓冲区的操作,不会影响源文件,若想保存编辑的效果到文件,可以使用编辑命令w
第2条命令删除源文件中1~4行,并保存到文件new.txt,若new.txt不存在则创建。需注意,若存在的话,则会覆盖new.txt中原来的内容
4.编辑命令读文件r
把add.txt文件中内容加入到模式定位行之后
5.编辑命令之变换命令y
替换命令是按字符替换所以必须相等,也就是aet部分的个数必须等于AET部分的个数,作用是分别把a换成A,e换成E,t换成T
六、sed缓冲区
sed中有两种缓冲区:模式缓冲区和(Pattern Buffer)和保持缓冲区(Hold Buffer),前面提及的缓冲区都是模式缓冲区,而保持缓冲区是另外的一块内存空间,更像是一个辅助的缓冲区,两个缓冲区可以实现内容的交换。
下面的例子是两种缓冲区的互换
命令2是一个3个编辑命令的组合语句,第一个是找到模式apple所在行,这样在模式缓冲区就有了这一行,再用编辑命令h复制保存到保持缓冲区,第二个是找到模式orange所在的行,在模式缓冲区也有这一行(这样就覆盖掉之前的那一句),再用x把模式缓冲区和保持缓冲区交换,于是乎orange那一行就变成了apple模式那一行,而实际的orange那一行被复制到了保持缓冲区;接着第三句,需额外补充一点的是sed中$符号不是正则表达式中表示行尾,而是表示最后一行。这样最后一句的意思就是定位到最后一行,并且使用编辑命令G,把保持缓冲区的内容追加上去,于是乎在最后一行的后面又出现了orange模式所在行。

1758

被折叠的 条评论
为什么被折叠?



