文本处理工具sed-1
Stream EDitor, 行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时
缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的
内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。
如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清
空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重
定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
sed默认处理完第一行以后会清除模式空间中的内容然后继续读取第二行。
用法:
sed option… ‘script’ inputfile…
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
-ic 在原文件编辑并复制原文件为filename+c
这里的script脚本是sed语言自己的脚本而不是之前的bash脚本
script:
‘地址命令’
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行, $: 最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#p
#,+#p
例如 : seq 100 > test
sed -n 1,10p test
sed -n 1,+9p test
/pat1/,/pat2/
#,/pat1/
例如:
sed –n ‘2,/root/p’ /etc/passwd 从2行开始
sed -n ‘/^$/=’ file 显示空行行号
(4) ~:步进
1~2 奇数行
2~2 偶数行
编辑命令:
d: 删除模式空间匹配的行,并立即启用下一轮循环
p: 打印当前模式空间内容,追加到默认输出之后
a []text:在指定行后面追加文本
sed ‘/root/a\superman’ /etc/passwd行后
支持使用\n实现多行追加
i []text:在行前面插入文本
sed ‘/root/i\superman’ /etc/passwd 行前
c []text:替换行为单行或多行文本
sed ‘/root/c\superman’ /etc/passwd 代替行
或者:
sed ‘2,5a superman is me !!!’ /etc/passwd
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中
匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
例子:
seq 5 > f1
cat f1
1
2
3
4
5
sed ‘2p’ f1
1
2
2
3
4
5
sed -n ‘2p’ f1
2
例如截取第二行
ifconfig ens33 | sed -n ‘2p’
截取最后一行
sed -n ‘$p’ /etc/passwd
截取带有root的行
sed -n ‘/root/p’ /etc/passwd
截取root开头的行
sed -n ‘/^root/p’ /etc/passwd
sed支持基本正则表达式,如果要使用扩展正则表达式可以用-r
显示第二行到第五行
sed -n ‘2,5p’ /etc/passwd
同
sed -n ‘2,+3p’ /etc/passwd
截取从b开头的行到f开头的行
sed -n ‘/^b/’,/^f/p’ /etc/passwd
sed -n ‘/^b/’,/^fffff/p’ /etc/passwd
如果不存在则默认会找到尾行为止
步进打印
sed -n ‘1~2p’ f1
1
3
5
7
9
多点编辑
sed -n -e ‘2p’ -e ‘6p’ f1
2
6
命令行文件调用
cat > sedscript.txt
2~2p
sed -f sedscript.txt
删除特定的行用d
sed ‘2d’ f1
1
3
4
5
sed ‘2!d’ f1
2
sed -n ‘/root/!p’ /etc/passwd
打印不包括root的行
为输出行加行号
sed -n ‘/root/=’ /etc/passwd
1
5
代表第1和第10行符合条件
在指定的行后面添加内容用命令a
sed ‘2,5a=====’ f1
1
2
=====
3
=====
4
=====
5
=====
在.bashrc中包含关键字aliases的行下一行添加alias p=poweroff的别名命令
sed ‘/aliases/aalias p=poweroff’ .bashrc
这里只是显示而没有真正修改文件,如果需要修改文件需要用-i
sed -i.bak ‘/aliases/aalias p=poweroff’ .bashrc
这里是修改文件.bashrc的同时建立原未修改文件并加.bak后缀,这样做可以在修改失败以后能够恢复。
如果想在添加内容的前面增加空格可以用\
sed ‘2,5a\ =====’ f1
1
2
======
3
======
4
======
5
======
此用法还能支持换行追加\n还能配合\ 例如
sed “/^alias g/a\ alias rm=’rm -i’\n\ alias p=poweroff” ./.bashrc
如果是在指定命令行前面添加内容则是使用i
sed ‘2,5i\ =====’ f1
1
=====
2
=====
3
=====
4
=====
5
如果是想直接代替指定的行就用c
sed ‘2,5c\ =====’ f1
1
=====
6
7
8
9
10
把符合条件的行储存到文件里面用w
sed ‘2,5w f2’ f1
cat f2
2
3
4
5
把某些文件的内容读入到指定行里用r
sed ‘2,5r /etc/issue’ f1
1
2
hi
3
hi
4
hi
5
hi
sed ‘/User/r sed.txt’ .bashrc
!相当重要的功能搜索替代
s///:查找替换,支持使用其它分隔符, s@@@, s### 类似vim的设置
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
学员评价