今天想起要用sed命令,但是做了很多次试验都是很意外的结果。所以特意看了下sed原理,这才恍然大悟。总结如下:
 
下面先做几个试验:对比着原理你就能明白了:
 
例子文件 example.txt
1
2
3
4
5
就是几个数字而已
比如你输入 sed  ‘’ example.txt
1
2
3
4
5
默认就可以将上面的东西打印出来。
如果你输入 sed -n ‘’ example.txt
那么就啥耶打印不出来
如果你输入: sed  ‘2p’ example.txt
那么就会出现一下的结果
1
2
2
3
4
5
重复出现了一个2.
现在再那个例子出来 sed  's/2//p' example.txt
————————————————————
1
 
3
4
5
————————————————————
如果你输入这个命令:sed ‘s/2//;p’ example.txt
————————————————————
1
1

3
3
4
4
5
5
 ————————————————————
 
 
 
要分析清楚,必须要先看下面的原理,看完了之后前几个命令不难理解。p命令是打印模式空间中的数据,如果没有匹配地址的话,那么就意味着全部匹配,这样每次读取一行就打印一行,我给出第一个命令的意思就是默认的时候里面应该是有个p命令(如果在‘’里面还[address-range][sed-command]语句的话,那么这个默认的p应该是放在这个语句的后面的,应该理解为:sed  ‘[address-range][sed-command];p example.txt’ ,注意红色的部分在现实的命令中是没有的,只是这么个默认的东西),sed  ‘’ example.txt  如果你在单引号里面再次的输入p,那么意味着内涵的p打印了一次匹配的模式空间的内容,再次加入的p又打印了一遍,得到的结果是每行打印两遍。从这个角度总结的话,那么最后两个命令就不难理解了:
sed  's/2//p' example.txt 是匹配了含有2的行并将其替换成为空并打印,因此只有匹配了的才打印,那么显示的匹配只打印一次就是一个空行,之后是默认的p打印,每行都是如此的处理,那么就会出现上面的结果。
 
sed ‘s/2//;p’ example.txt 和上面的相似,但是匹配的行并没有用p打印,之后是;p这个命令,那么他就是全部打印,之后是默认的p命令,这样的输出结果是只打印后两个p命令的输入,分号前面的替换操作是没有打印的。
 
而sed有个-n的操作,这个-n的意思就是关闭这个默认的p命令。
 
基本上就是这个意思,如果有分析不对的地方轻指教啊!!
 
 
 
 
先粘贴下原理:
Sed工作原理
 
sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。
 
下面我们看一下sed的工作过程。
 
sed不是在原输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理,处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果),而是直接输出到屏幕上。sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sedsed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。
sed原理及p参数的运用的分析_职场
 
一般情况下暂存缓冲区是用不到的,但有特殊的命令可以在模式空间与暂存缓冲区之间交换数据,后文将有介绍。由于sed对文本的所有操作都是在缓冲区里进行的,所以不会对原文件造成任何破坏。
 

4.2            Sed命令格式

 
sed的命令格式如下:
 
sed [-Options] [‘Commands’] filename
 
其中,Command是一个sed命令,sed命令一定要被包含在一对单引号中,以免被shell解释,其格式如下:
 
[address-range][sed-command]
[Pattern-to-match][sed-command]
 
address-range是指要处理的行的范围,又叫地址范围;pattern-to-match是一个要匹配的模式,是一个正则表达式,sed-command是一个sed命令,用来对指定的行进行处理。下面是一个简单的例子:
 
sed –n ‘1,3p’ students
 
这个命令将文件students中的第13行打印到屏幕。注意,地址范围和sed命令之间没有空格,如果加入空格,sed也会将其忽略。参数-n用来取消默认输出。默认情况下,sed每读入一行到模式空间,无论是否对其进行处理,在读入下一行之前多要将模式空间中的内容输出到屏幕上。参数-n可以用来取消这种默认的输出,只有当用户用命令p时才将指定的行输出到屏幕。如果没有用参数-n而又对指定行执行了p命令,那么这些行将会被打印两次。
 
地址范围可以是一个数字,这个数字代表了一个行号;也可以是一个用逗号分隔的两个数字表示的范围(包括这两行)。范围可以是数字,正则表达式,或是两者的组合。
 
pattern-to-match是一个要匹配的模式,sed将会对所有匹配的行执行sed-command。其实,这里的pattern-to-match也可以看作是一个地址,这个地址是所有与指定模式匹配的行的行号。因此sed的格式可以归纳为一种:
 
sed [-Options] ‘[address-range][sed-command]’ filename