首页 > 代码库 > sed命令详解
sed命令详解
sed命令详解
sed:Stream EDitor 流编辑器,行编辑器
sed [OPTION]... `script` [input-file]...
script:地址定界编辑命令
1.常用选项:
-n:不/禁止输出模式空间中的内容至屏幕
(静止默认行为,默认输出所有,最终输包括两点:默认的和‘’定义的)
-e script,--expression=script:多点编辑
-f /PATH/TO/SED_SCRIPT_FILE
每行一个编辑命令
-r, --regexp-extened:支持使用扩展正则表达式
-i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件(并保存在原文件中)
2.地址定界:
(1)空地址:对全文进行处理
(2)单地址:
#:指定行
/pattern/:被模式所匹配到的每一行
(3)地址范围:
#,#:起始行道结束行
#,+#:比如3,+8表示从第三行开始加8行结束,包含第三行,共九行
#,/pat1/:从指定行开始到匹配到的第一个模式所在行结束
/pat1/,/pat2/,/pat3/... 第二、第三个模式...结束
(4)步进:~
1~2:表示1,3,5,7,9....行(奇数行)
2~2:2,4,6...行(偶数行)
3.编辑命令:
(1)d:删除 eg: ~]# sed ‘1,5d’file 表示删除file的前5行,输出剩下行。
~]# sed ‘/^UUID/d’ file 删除UUID开头的所有行
~]#sed ‘/^#/d’file 删除#开头的所有行
~]#sed -n ‘1,5d’ file 理解:先匹配到除删除的5行输出,这输出被-n所禁
止,所以最终输出的是空白。
~]#sed ‘3d’ file 删除第三行
~]#sed’1~2d’ file 删除奇数行,输出偶数行
(2) p:print当前模式:默认情况输出一遍,p命令再输一遍。
eg: ~]# cat test
1
2
3
4
5
6
~]# sed ‘1~2p‘ ./test
1
1
2
3
3
4
5
5
6
(3) a \text(append):在行后面追加文本“text”,支持使用\n实现多行追加
(4) i \text(insert):在行前面追加文本“text”,支持使用\n实现多行追加
eg:在第三行前插入 ~]# sed ‘3i \new line‘ ./test
1
2
new line
3
4
eg:在第三行后添加 ~]# sed ‘3a \new line‘ ./test
1
2
3
new line
4
eg:支持实现多行追加
~]# sed ‘3a \new line \nanother new line‘ ./test
1
2
3
new line
another new line
4
eg:在指定的没一行后添加一个内容,此中在UUID行后添加一个#的注释信息
t ~]# sed ‘/^UUID/a\# add new device base on UUID‘ ./test
UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /
# add new device base on UUID
UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /
# add new device base on UUID
UUID=4679cd8d-a956-4114-8f65-0ec38397d35b /boot
# add new device base on UUID
(5)c \text(change):将匹配到的行替换为此处指定的文本“text”
eg:将上述UUID的行用text内容替换掉
~]# sed ‘/^UUID/c\# add new device base on UUID‘ ./test
# add new device base on UUID
# add new device base on UUID
# add new device base on UUID
# add new device base on UUID
# add new device base on UUID
(6) w \PATH\TO\SOMEFILE:将模式空间中匹配到的行保存到指定的文件 中
eg:此中将/etc/fstab中非#开头的行保存至/tmp/fstab.new中
~]# sed -n ‘/^[^#]/w /tmp/fstab.new‘ /etc/fstab
~]# cat /tmp/fstab.new
UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /
UUID=4679cd8d-a956-4114-8f65-0ec38397d35b /boot
UUID=efbf4f17-d0bd-4e8b-b740-2bc56aba720c swap
(7) r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件中;合并文件
eg: 表示将/etc/issue中的内容写入(插入)到/etc/fstab内容的第三行位置
(文件合并的一种方法)
~]# sed ‘3r /etc/issue‘ /etc/fstab
(8)=:为模式匹配到的行加行号
eg: ~]# sed ‘/^UUID/=‘ /etc/fstab
9
UUID=5ef6bf9b-eaa0-4523-ad82-97b0f3af8097 /
10
UUID=4679cd8d-a956-4114-8f65-0ec38397d35b /boot
11
UUID=efbf4f17-d0bd-4e8b-b740-2bc56aba720c swap
(9)! :条件取反
eg:~]# sed ‘/^#/!d‘ /etc/fstab
不加!表示将非#开头行留下,加!取反将#开头行留下
(10)s///:查找替换,其分隔符可自行定义,常用的有s@@@,s###等:
替换标记:
g:全局替换
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中
p:显示替换成功的行
练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符。
sed ‘s@^[[:space:]]\+@@‘ /etc/grub2.cfg
@...@@:被替换部分 @@:替换部分,此中将空白部分替换成无,什么都没有。
练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符。
~]# sed ‘s@^#[[:space:]]*@@‘ /etc/fstab
练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
替换messages
~]# echo "/var/log/messages" | sed ‘s@[^/]\+$@@‘
/var/log/
替换messages,当其后有/时,加\?,表示查找可有可无这种情况
~]# echo "/var/log/messages" | sed ‘s@[^/]\+/\?$@@‘
/var/log/
sed命令详解