语法
代码语言:javascript复制sed [option] 'script' FILENAME
option:
-n:不往屏幕上打印模式空间中的内容
-e:多点编辑
-f /PATH/FILENAME:从指定文件中读取脚本
-r:支持使用扩展正则表达式
-i.bak:编辑文件之前先备份
script:
'地址命令'
option
选项 -n
有一个test文件,文件内容如下:
打印这个文件的第二行
会发现第二行输出了两行,是因为sed是按行处理的,每处理一行就存储到模式空间中,sed把模式空间的内容全都输出了,我们又用2p打印了第二行,所以就会出现上图中的内容,如果我们不输出模式空间中的内容,只输出我们指定的行,应该怎么做呢?加上-n参数即可
选项 -e
如果想输出第二行和第五行的内容,可以多次指定-e参数
选项 -f
如果脚本(就是引号中的)比较多,可以把这些脚本写到一个文件中,每行一个
把2p(打印第二行)和4p(打印第四行)写到script文件中,使用sed -f指定脚本名
选项 -i.bak
代码语言:javascript复制sed -i.bak '/pattern/' FILENAME # 在修改文件之前,先备份,在修改,备份文件名为 FILENAME.bak
script
地址
不写地址
代码语言:javascript复制如果省略地址,处理文件中的所有行
单地址
代码语言:javascript复制# # 行号,指定的行
$ # 最后一行
/pattern/ # 能够被正则表达式匹配到的每一行
地址范围
代码语言:javascript复制#,# # 行号,第几行到第几行
#, # # 比如10, 20,就是10到10 20行
/pattern1/,/pattern2/ # 从满足pattern1模式开始,到满足pattern2模式结束
#,/pattern1/ # 从第#行开始,到满足pattern1模式结束
步长
代码语言:javascript复制1~2 # 从第一行开始,步长为2,就是奇数行
2~2 # 从第二行开始,步长为2,就是偶数行
命令
代码语言:javascript复制d # 删除模式空间匹配到的行
p # 打印当前模式空间的内容
! # 模式空间的行取反
abb # 追加,在指定的行后面追加文本
ibb # 追加,在指定的行前面追加文本
cbb # 替换
w /PATH/FILENAME # 保存模式匹配的行到指定的文件
r /PATH/FILENAME # 从指定的文件中读取内容到模式空间中匹配到的行后面
命令 d
删除模式空间的第2行,打印其他行
命令 !
要把!号放在行号后面
命令 a
从第一行到第五行,每一行后面都追加“ ”
命令 i
在指定的行前面追加文本内容
命令 c
使用指定的文本内容替换指定的行
命令 w
我们把test文件中的第一行到第三行的内容,保存到/tmp/test01文件中
命令 r
我们把/tmp/test01文件中的内容读取出来,插入到第二行的后面
替换
代码语言:javascript复制s///:查找替换,还可以用其分隔符,如s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /PATH/FILENAME:把替换成功的行保存到文件中