当在命令行上执行sed的时候:
sed ' '
或者
sed -e' '
也可以有多个编辑指令,当有多个编辑指令的时候,必须使用-e选项
sed -e' ' -e' ' -e' '
指令是从左向右执行
我们也可以写一个脚本文件 使用 -f选项执行
sed -f filename
我们也可以混用 -e -f 选项,此时的执行仍然是从左到右执行
===============================================================
编辑指令的格式:
地址部分 和 函数部分
[address1[,address2]function[argument]
地址1 和地址2 可以是行数(意思是多少行到多少行),也可以是字符串(意思是首次函数某个字符串的数据行),也可以是两者的混合
1, 如果用字符串表示某一样,这个字符串必须用 //扩起来
2,字符串可以使用通配符,正则表达式
10,200 第十行到第二百行
10,/test/ 从第十行到 首次出现test这个字符串的地方
/test1/,/test2/ 从出现test1的行到出现test2的行
特殊:
1,使用通配符和正则表达式 /t.*t/表示所有含有两个t为首位的字符串的行 t为开头 .表示任一字符, *表示前面重复任意次,t表示结尾
2,当没有地址参数的时候,表示对所有的数据行都执行函数命令
当只有一个地址参数的时候,表示只有符合的地址才执行函数命令
1) 10 仅仅操作第十行
2) /test/仅仅操作出现test的行(所有行,不是首次出现的行)
===============================================================
sed的结果默认是输出到 标准输出。如果我们想更改这个,需要在执行sed的时候添加上 -n选项。
sed -n -e' '
这样 结果的输出 控制权就转移到了编制指令部分(也就是单引号的部分)
================================================================
=============地址部分介绍完了,现在是函数部分,挨个介绍====================
s 表示替换(substitute)文件内字符串
[address1 [,address2]] s /pattern/replacemen/[flag]
s最多和两个地址参数匹配
patrern表示文件中要被替换的字符串
replacement表示要被替换为的字符串,当这个字符串中出现下列特殊字符的时候,有特殊的意义:
1)出现&的时候,他表示前面要替换的pattern字符串
sed -e's/test/& my car'
test 被替换为test my car
2)出现\字符的时候,是转义字符
flag 介绍
1)如果flag为空,那么仅仅替换文件中第一次出现的pattern的地方
2)flag为g的时候,替换全部的pattern
3)当为十进制数字m的时候,替换第m个出现的pattern
4) p的时候,替换第一个pattern,然后把数据输出到标准输出文件
5)w filename 替换第一个pattern,然后把数据输出到文件filename,如果filename文件不存在,创建之
--------------------------------------------------------------------------------------------------------------
c 替换指定范围内的所有行内容为指定内容
[address1 [,address2]]c\要替换为的内容
就是把地址范围内的内容替换为要替换的内容,如果要替换为的内容为多行,那么行之间用\符号隔开
----------------------------------------------------------------------------------------------------------------
d 函数命令
删除 地址范围内的数据行
[address1[,address2]]d
把文件中所有空白行都删掉: sed -e '/^$/d' filename
/^$/是正则表达式,空白行
把文件中所有的连续空白行删除为一行
sed -e '/^$/ {
N
/^$/D
}' filename
没明白这个地方!!
--------------------------------------------------------------------------------------------------------------
a 在指定的行下一行添加内容
在第3行下一行添加内容 test
sed -e '3a\test' filename
在所有出现字符串peter的行下一行添加内容test
sed -e '/peter/a\test' filename
命令i 格式同 a,不过是在指定行的前一行
---------------------------------------------------------------------------------------------------------------
p 打印输出 地址范围内的内容
[address1[,address2]p
--------------------------------------------------------------------------------------------------------------
y 命令
[address1 [,address2]] y /abcdefg/1234567/
y后面两个字符串长度必须一样,它会挨个第一个 ,第二个,第三个 字符替换,常用于消息字母转变为大写字母
---------------------------------------------------------------------------------------------------------------
! 表示不执行函数参数,就是处理 “除了地址范围内的行”
sed -e '/test/!d'
意思是出了包含test的行,都删除。也就是取补集的意思
=============================================================
pattern 区和hold区
sed有两个缓冲区,pattern区和hold区,其工作原理如下:
先读入一行,去掉尾部换行符,存入pattern space,执行编辑命令。
处理完毕,除非加了-n参数,把现在的pattern space打印出来,在后边打印曾去掉的换行符。
把pattern space内容给hold space,把pattern space置空。
接着读下一行,处理下一行。
一种非平凡情况,一个文件仅一行,尾部没换行,sed只打印,不会尾部加换行,但若在尾部又附加了输出,他会再补上那个换行。
---------------------------------------------------------------------------------------------
关于这两个区的使用,有下面几个函数命令
g 把hold区的内容复制到pattern中,pattern区中原来的内容会丢失。
G 把一个换行符和hold区中的内容追加到pattern中。
这里,pattern正常情况下一直存着一行的内容,那么这么处理之后,这个pattern中就不只有一行
了,当pattern内数据处理完毕之后,我们就要把pattern数据给hold区,然后清空pattern区。
h 把pattern的数据复制到hold区,原来hold区中的内容会丢失。
H 把一个换行符和pattern区的内容附加到原来的hold区
x交换pattern区和hold区内容。
下面是这几个命令的几个应用:
sed -e 'G' filename
作用是filename文件中的每一行后面添加一个空行(因为默认的hold区内容是空的,那么G只是附加了一个换行符到filename的每一行后面)
sed的执行机理,我刚刚的理解太失偏颇了。
不管是直接在命令行上执行也好,写一个脚本执行也好。执行的单位是行。也就是说说,会对输入文件的每一行为单位,执行命令行的函数操作或者完整的脚本操作,然后读入下一行。
sed首先读入文件的第一行,把他放到pattern,然后对他进行处理,执行命令或者执行脚本,当处理完这一行之后,sed会显示pattern中的内容(如果命令是d,删除,内容是空),然后把这一行移除pattern区,然后读取下一行,继续进行处理。结果的输出是一行一行来的,不是把整个输入文件处理完后,输出出来。
把文件倒序输出的脚本
2,$G
h
$!d
分析的时候,记住上面的红色部分,一行一行分析即可。《linux命令、编辑器、shell编程实例大全》 杨明华P581分析了
==========================================================================
上面G g H h x这几个命令是调整所操作文件本身的内容位置。
w r 是操作两个文件
w 把地址范围的内容放到一个文件中保存起来(说白了就是写到一个新的文件中去,这个没啥用,一个内容重定向> 就搞定了)
r 是输出pattern数据之后。立即输出参数文件的内容,这样用于拼凑文件,感觉也没啥用。
=========================================================================
n 命令,读取下一行到pattern,这里我的理解是,把原来的pattern中的那一行顶掉了
这个可以用于 打印文件的奇数/偶数 行
打印偶数行:
sed -e 'n' -e 'p' filename
N读取下一行,并添加到pattern,也就是说pattern中有两行。
-------------------------------------------------------------------------------------------------------------------------------
q 退出,表示当满足地址范围的额时候,停止输入pattern 数据,并停止数据输出到标准输出文件。
这可以用于碰到一个特定的行,我们就停止执行。挺好用的,应该
-------------------------------------------------------------------------------------------------------
D 删除pattern内的第一行数据,当pattern中只有一行数据的时候,和d相同
P 打印pattern中第一行数据,
阅读(543) | 评论(0) | 转发(0) |