1.sed工作机制
sed处理文本文件时,首先会被读到模式空间中,而不修改原文件。sed可以对文本文件的所有行进行操作,也可以通过正则表达式进行匹配,使得sed可以只处理模式空间中的被正则表达式匹配到的行。
然后再判断模式空间中的文本是否会被正则表达式匹配到,如果匹配到,就会对匹配到的文本做编辑操作,之后再将被编辑的文本和没有被编辑的文本一同输出到标准输出
如果模式空间没有被正则表达式匹配到,直接将没有被匹配到的文本原样输出至标准输出
1.用法格式
1: sed 【选项】 脚本 文件
2: 脚本组成: 地址定界 编辑命令
3: 常用的一些命令选项
-n:不输出模式中的内容至屏幕,也就是不会将没有匹配到的文本输出到标准,只是输出编辑到的文本
-e: 脚本:可以指定多个脚本,实现多次编辑
-f: 脚本文件 :每一行一个编辑命令
-i:直接修改文件
-r:表示使用扩展的正则表达式
2.地址定界
地址定界(与vim的末行模式类似)
(1)全文匹配:不需要给定地址,表示全文匹配,而vim需要给定%表示全文匹配
(2)单地址匹配:写一个数字即可,例如:8表示匹配第8行
(3)多地址匹配:给定一个范围,
例如:1,9 表示匹配第1行到第9行
例如:1,+2 表示匹配第一行到第三行
(4)模式匹配:
例如:/正则表达式/ 表示正则表达式匹配到的行
例如:1,/正则表达式/ 表示从第一行到正则表达式匹配到的行
(5)步长匹配
例如:1~2 表示所有奇数行
例如:2~2 表示所有偶数行
3.编辑命令
其实编辑命令 与 vim的末行模式类似 d命令是特例,需要特别注意,不能加-n 选项
下面是一些命令的使用以及例子:
(1)[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '1,2d' wqp
789
qwe
asd
zxc
d: 删除,对应d命令来说,不要安装sed的工作机制去理解,原因是对应d命令而言,没有匹配到的文本是不会输出到标准输出的。例如:下面的sed对yhy文件进行处理,不会将没有匹配到文本的输出至标准输出,而是将编辑后的文本输出到标准输出
继续拿上面的例子来说
sed '/^[[:space:]]\+/d' wqp
123
789
asd
注意:上述的 不要认为是正则表达式 正则表达式的话 sed 后面一般都要加上 -r ^[[:space:]]\+ 其中 “^” 是托字符 其中的含义是表示 以空白格开头的行 “ \+” 中 “\”表示转义符 “+”表示一个或者多个 前面加上这个转义符号 才能使用
(2)p: 打印
一定要-n选项,如果不加-n那么打印的行将会显示两遍
[root@localhost /]# sed -n '1,3p' wqp
123
456
789
[root@localhost /]# sed '1,3p' wqp
123
123
456
456
789
789
qwe
asd
zxc
可以根据上面的常用命令的选项 来理解
(3)a\字符串:在行后面追加字符串,支持使用\n实现多行追加
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '2a\www' wqp
123
456
www
789
qwe
asd
zxc
(4)i\字符串:在行前面插入字符串,支持使用\n实现多行插入
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '2i\www' wqp
123
www
456
789
qwe
asd
zxc
(5)c\字符串:把匹配到的行替换为字符串
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '2c\www' wqp
123
www
789
qwe
asd
zxc
(6)w 文件路径:将匹配到的行重定向至指定的文件中
例如:sed '/^[^#]/w yhy.txt' /etc/fstab 将非井号开头的行保存至yes.txt文件中
(7)r 文件路径:读取指定文件的内容插入到当前文件被匹配到的行处
[root@localhost /]# cat www
123
123
456
789
000
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '3r/www' wqp
123
456
789
123
123
456
789
000
qwe
asd
zxc
(8)=:表示被模式匹配到的行上面加上一个行号
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '/^asd/=' wqp
123
456
789
qwe
5
asd
zxc
(9)!:取反条件
例如:sed '/^#/!d' /etc/fstab 将不是以#好开头的行删除
(10)s///:查找替换,常用的有s@@@, s### ,
修饰符有:
g:全局替换,表示可以替换一行中多次匹配到的字符串。如果不加g,那么只能替换一行中第一次出现的字符串
w 文件路径:替换成功的结果保存至指定文件中
p :显示替换成功的行
3 练习
1:删除/etc/grub2.cfg文件中所有的以空白字符开头的行的行首的所有空白字符
sed 's/^[[:space:]]\+//' /etc/grub2.cfg
2:删除/etc/fstab文件中所有以#开头的行的行首的#号且紧跟#号后面的所有空白字符
sed -r 's/^#[[:space:]]*//' /etc/fstab
3:输出一个绝对路径给sed命令,取出其文件名
echo "/var/log/messages" | sed -r 's#^.*/(.*)#\1#' 正确
echo "/var/log/messages" | sed -r 's/^.*/(.*)/\1/' 错误
echo "/var/log/messages" | sed 's/^.*\/\(.*\)/\1/' 正确, 不用扩展正则表达式
4:输出一个绝对路径给sed命令,取出其目录名,相当于dirname
echo "/var/log/messasdfasdf/" | sed -r 's#(.*)/.*#\1#'
注意: 再上面的4题中可以得知 只是就自己个人观点 在加上自己动手时间操作观察得到的
[root@localhost /]# sed -r 's/^[[:space:]]*//' wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed 's/^[[:space:]]\+//'
^C
[root@localhost /]# sed 's/^[[:space:]]\+//' wqp
123
456
789
qwe
asd
zxc
可以看出 上面一个使用了正则表达式 一个没有使用 但是结果相同 一个有转义符号的 没有加上 -r 带有 “*” 加上了-r 还有题中所加上的 * 表示 匹配到的 0,1,或多次 (个人看来 要加上 * 的一般都是扩展正则表达式)
sed处理文本文件时,首先会被读到模式空间中,而不修改原文件。sed可以对文本文件的所有行进行操作,也可以通过正则表达式进行匹配,使得sed可以只处理模式空间中的被正则表达式匹配到的行。
然后再判断模式空间中的文本是否会被正则表达式匹配到,如果匹配到,就会对匹配到的文本做编辑操作,之后再将被编辑的文本和没有被编辑的文本一同输出到标准输出
如果模式空间没有被正则表达式匹配到,直接将没有被匹配到的文本原样输出至标准输出
1.用法格式
1: sed 【选项】 脚本 文件
2: 脚本组成: 地址定界 编辑命令
3: 常用的一些命令选项
-n:不输出模式中的内容至屏幕,也就是不会将没有匹配到的文本输出到标准,只是输出编辑到的文本
-e: 脚本:可以指定多个脚本,实现多次编辑
-f: 脚本文件 :每一行一个编辑命令
-i:直接修改文件
-r:表示使用扩展的正则表达式
2.地址定界
地址定界(与vim的末行模式类似)
(1)全文匹配:不需要给定地址,表示全文匹配,而vim需要给定%表示全文匹配
(2)单地址匹配:写一个数字即可,例如:8表示匹配第8行
(3)多地址匹配:给定一个范围,
例如:1,9 表示匹配第1行到第9行
例如:1,+2 表示匹配第一行到第三行
(4)模式匹配:
例如:/正则表达式/ 表示正则表达式匹配到的行
例如:1,/正则表达式/ 表示从第一行到正则表达式匹配到的行
(5)步长匹配
例如:1~2 表示所有奇数行
例如:2~2 表示所有偶数行
3.编辑命令
其实编辑命令 与 vim的末行模式类似 d命令是特例,需要特别注意,不能加-n 选项
下面是一些命令的使用以及例子:
(1)[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '1,2d' wqp
789
qwe
asd
zxc
d: 删除,对应d命令来说,不要安装sed的工作机制去理解,原因是对应d命令而言,没有匹配到的文本是不会输出到标准输出的。例如:下面的sed对yhy文件进行处理,不会将没有匹配到文本的输出至标准输出,而是将编辑后的文本输出到标准输出
继续拿上面的例子来说
sed '/^[[:space:]]\+/d' wqp
123
789
asd
注意:上述的 不要认为是正则表达式 正则表达式的话 sed 后面一般都要加上 -r ^[[:space:]]\+ 其中 “^” 是托字符 其中的含义是表示 以空白格开头的行 “ \+” 中 “\”表示转义符 “+”表示一个或者多个 前面加上这个转义符号 才能使用
(2)p: 打印
一定要-n选项,如果不加-n那么打印的行将会显示两遍
[root@localhost /]# sed -n '1,3p' wqp
123
456
789
[root@localhost /]# sed '1,3p' wqp
123
123
456
456
789
789
qwe
asd
zxc
可以根据上面的常用命令的选项 来理解
(3)a\字符串:在行后面追加字符串,支持使用\n实现多行追加
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '2a\www' wqp
123
456
www
789
qwe
asd
zxc
(4)i\字符串:在行前面插入字符串,支持使用\n实现多行插入
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '2i\www' wqp
123
www
456
789
qwe
asd
zxc
(5)c\字符串:把匹配到的行替换为字符串
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '2c\www' wqp
123
www
789
qwe
asd
zxc
(6)w 文件路径:将匹配到的行重定向至指定的文件中
例如:sed '/^[^#]/w yhy.txt' /etc/fstab 将非井号开头的行保存至yes.txt文件中
(7)r 文件路径:读取指定文件的内容插入到当前文件被匹配到的行处
[root@localhost /]# cat www
123
123
456
789
000
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '3r/www' wqp
123
456
789
123
123
456
789
000
qwe
asd
zxc
(8)=:表示被模式匹配到的行上面加上一个行号
[root@localhost /]# cat wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed '/^asd/=' wqp
123
456
789
qwe
5
asd
zxc
(9)!:取反条件
例如:sed '/^#/!d' /etc/fstab 将不是以#好开头的行删除
(10)s///:查找替换,常用的有s@@@, s### ,
修饰符有:
g:全局替换,表示可以替换一行中多次匹配到的字符串。如果不加g,那么只能替换一行中第一次出现的字符串
w 文件路径:替换成功的结果保存至指定文件中
p :显示替换成功的行
3 练习
1:删除/etc/grub2.cfg文件中所有的以空白字符开头的行的行首的所有空白字符
sed 's/^[[:space:]]\+//' /etc/grub2.cfg
2:删除/etc/fstab文件中所有以#开头的行的行首的#号且紧跟#号后面的所有空白字符
sed -r 's/^#[[:space:]]*//' /etc/fstab
3:输出一个绝对路径给sed命令,取出其文件名
echo "/var/log/messages" | sed -r 's#^.*/(.*)#\1#' 正确
echo "/var/log/messages" | sed -r 's/^.*/(.*)/\1/' 错误
echo "/var/log/messages" | sed 's/^.*\/\(.*\)/\1/' 正确, 不用扩展正则表达式
4:输出一个绝对路径给sed命令,取出其目录名,相当于dirname
echo "/var/log/messasdfasdf/" | sed -r 's#(.*)/.*#\1#'
注意: 再上面的4题中可以得知 只是就自己个人观点 在加上自己动手时间操作观察得到的
[root@localhost /]# sed -r 's/^[[:space:]]*//' wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed 's/^[[:space:]]\+//'
^C
[root@localhost /]# sed 's/^[[:space:]]\+//' wqp
123
456
789
qwe
asd
zxc
可以看出 上面一个使用了正则表达式 一个没有使用 但是结果相同 一个有转义符号的 没有加上 -r 带有 “*” 加上了-r 还有题中所加上的 * 表示 匹配到的 0,1,或多次 (个人看来 要加上 * 的一般都是扩展正则表达式)