赞
踩
目录
sed命令来自于英文词组“stream editor”的缩写,其功能是用于利用语法/脚本对文本文件进行批量的编辑操作。sed命令最初由贝尔实验室开发,后被众多Linux系统接纳集成,能够通过正则表达式对文件进行批量编辑,让需要重复的工作不再浪费时间。
语法格式:sed 参数 文件
常用参数:
-e或--expression=<script> | 以指定的脚本来处理输入的文本文件 |
-f<script文件>或--file=<script文件> | 以指定的脚本文件来处理输入的文本文件 |
-h或--help | 显示帮助 |
-n或--quiet或--silent | 仅显示script处理后的结果 |
-V或--version | 显示版本信息 |
模式:以关键词sed开始,以某文件结尾,中间给出条件和动作,用两个单引号包住。
sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。sed 是逐行读取文本的,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i参数使执行结果更新原文件。
-n能取消sed的默认输出。不使用-n时,sed首先读取一行,并默认将缓冲区内的文本输出出来,之后p子命令再次输出。使用-n时,默认输出取消,只有p子命令的输出结果。
翻译如下:
n 读取下一行到模式空间
N 追加下一行到模式空间
p 打印当前模式空间
P 打印当前模式空间的第一part
n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出).
N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符.
了解了动作的意义之后,再通过几个例子加深理解。
执行过程分析:
“seq 10"按序生成1-10,通过管道传给下一个命令sed执行。
sed 第一次处理 :
seq 把生成的"1"传给 sed ,即当前模式空间内容为"1",之后先执行命令n,读入下一行数据"2",原来的”1“将会从模式空间中被送往屏幕默认输出,即分析所写默认输出"1",此时模式空间内容为"2"。接着执行命令p,打印模式空间内容(即"2"),即分析所写p输出2。
sed 第二次处理:
sed每处理完一行,都会接着处理下一行,这样不断重复,直至文件末尾。此时sed读入下一行数据"3",原来的”2“将会从模式空间中被送往屏幕默认输出,即分析所写默认输出"2",此时模式空间内容为"3"。之后先执行命令n,读入下一行数据"4",原来的”1“将会从模式空间中被送往屏幕默认输出,即分析所写默认输出"3",此时模式空间内容为"4"。接着执行命令p,打印模式空间内容(即"4"),即分析所写p输出4。sed 第X次处理则由读者自行思考并核对分析以验证。
此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出,该命令即为选择偶数项:
Q:模式空间里明明有5,sed也默认输出了,p的作用是打印当前模式空间,那为什么分析的p输出中没有5呢?
A:5没有输出。是的,这是为什么呢?可以info sed看看n的解释“If there is no more input then 'sed' exits without processing any more commands.”,如果没有可以读取的内容,那么sed将不会处理后面的任何命令。当sed读到5的时候,已经没有下一行内容了,那么n将退出,也不再执行后面的p。所以5没有输出。
seq命令 - 打印数字序列
seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式、宽度、分割符号进行控制。
此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出:
Q:模式空间里明明有5,sed也默认输出了,p的作用是打印当前模式空间,那为什么分析的p输出中没有5呢?
A:5没有输出。是的,这是为什么呢?可以info sed看看N的解释“If there is no more input then 'sed' exits without processing any more commands.”,如果没有可以追加的内容,那么sed将不会处理后面的任何命令。当sed读到5的时候,已经没有下一行内容了,那么N将退出,也不再执行后面的P。所以5没有输出。
此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出:
可以看到该命令执行结果与 seq 5 |sed 'n;p' 一致,这是因为P是打印模式空间中的part 1,而情况中模式空间just one part,导致结果显示一致。
此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出:
Q:如果我想用该命令打印奇数行怎么办? 它并不会输出5.
A:用 $!N,让N对最后一行不起作用,这样P就能继续执行。
此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出,该命令则为选择奇数项:
qaq
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。