linux sed 学习

sed

  • 语法:
sed [选项] [sed内置命令字符] file
  • 选项
参数选项说明
-n取消 sed 的默认输出,常与 sed 内置命令 p 一起使用
-i直接将修改数据写入文件,一般使用 -i.bak 在修改之前备份
-e支持多次编辑,不需要管道符
-r支持扩展正则

1. 内置命令符

内置命令字符说明
aappend 对文本追加,在指定行后面添加一行(多行)内容
ddelete 删除匹配行
iinsert 表示插入文本,在指定行之前插入一行(多行)内容
pprint 打印匹配到的内容,通常和 -n 一起使用
s/正则/替换内容/g匹配正则内容,然后替换(支持正则),结尾 g 表示全局匹配

2. sed 匹配范围

范围说明
空地址全文处理
单地址指定文件某一行
/pattern/被模式匹配到的每一行
范围区间10,20 十到二十行, 10,+5 第十行向下5行
步长1~2,表示从1开始间隔2个,即1/3/5/7 , 2~2,表示从2开始间隔2个,即2/4/6/8

匹配符说明
^锚定行的开始 如:/^sed/匹配所有以sed开头的行
$锚定行的结束 如:/sed$/匹配所有以sed结尾的行
.匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d
*匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行
[]匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed
[^]匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行
(…)保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers
&保存搜索字符用来替换其他字符,如s/love/&/,love这成love
<锚定单词的开始,如:/\
>锚定单词的结束,如/love&gt;/匹配包含以love结尾的单词的行
x{m}重复字符x,m次,如:/0{5}/匹配包含5个o的行
x{m,}重复字符x,至少m次,如:/o{5,}/匹配至少有5个o的行
x{m,n}重复字符x,至少m次,不多于n次,如:/o{5,10}/匹配5–10个o的行

3. 练习题:

1.替换文件中的 root 为 dong ,只替换一次和替换所有

# 替换一次
sed 's/root/dong/p' pwd.txt  -n
# 全部替换
sed 's/root/dong/gp' pwd.txt  -n

2.替换前十行 b 开头的用户,改为 D ,且仅仅显示替换后的结果

sed '1,10s/^b/D/p' pwd.txt -n

3.替换前十行 b 开头的用户,改为 D, m 开头的行改为 M ,且仅仅显示替换后的结果

sed -e '1,10s/^b/D/p' -e '1,10s/^m/M/p' pwd.txt -n

4.删除4行后面所有的

# 这里是从第五行一直删到结尾
sed '5,$d' pwd.txt

5.删除从 root 开始到 ftp 之间的行

sed '/^root/,/^ftp/d' pwd.txt

6.将文件中空白字符开头的行添加注释

sed 's/^[[:space:]]/#/p' test.txt -n
# 将空行也添加注释
sed -e 's/^[[:space:]]/#/p' -e 's/^$/#/p'  test.txt -n

7.删除文件的空白行和注释行

sed -e '/^$/d' -e '/^#/d' test.txt
sed '/^$/d;/^#/d' test.txt

8.给文件的前三行添加 #

# \1 表示引用前面分组的内容
sed -r '1,3s/(^.)/#\1/' test.txt

9.使用 sed 截取出 ip 地址

ifconfig eth0 | sed '2p' -n | sed 's/.*inet[[:space:]]*//' | sed 's/netmask.*//'
or
ifconfig eth0 | sed '2s/.*inet[[:space:]]*//;s/netmask.*//p' -n

10.找出系统版本

# 命令解析
# .*release[[:space:]]*    匹配到 release 包括后面的空格
# [[:space:]]*             表示多个空格
# ([^.])                   表示匹配除了小数点以外的所有内容,() 括号表示分组,为后面 \1 引用
# .*                       表示后面的一个或者多个
# +                        表示贪婪匹配,即匹配 . 之前的多个内容
sed -r 's/.*release[[:space:]]*([^.]).*+/\1/p' /etc/centos-release -n

4. 常见操作

4.1 删除配置文件中#号注释行
sed -ri '/^#/d' file.conf 
sed -ri '/^[ \t]*#/d' file.conf
4.2 删除配置文件中//号注释行
sed -ri '\Y^[ \t]*//Yd' file.conf
4.3 删除无内容空行
sed -ri '/^[ \t]*$/d' file.conf
4.4 删除注释行及空行
sed -ri '/^[ \t]*#/d; /^[ \t]*$/d' /etc/vsftpd/vsftpd.conf 
sed -ri '/^[ \t]*#|^[ \t]*$/d' /etc/vsftpd/vsftpd.conf 
sed -ri '/^[ \t]*($|#)/d' /etc/vsftpd/vsftpd.conf
4.5 插入和追加
# 文件最后一行下面增加内容
sed '$a123' a.txt              

# 文件每行下面增加内容
sed 'a123' a.txt

# 文件第5行下面增加内容
sed '5a123' a.txt

# 在匹配到的内容之后追加内容
sed '/2222/a\123' a.txt

# 文件最后一行上一行增加内容
sed '$i123' a.txt

# 文件每行上一行增加内容
sed 'i123' a.txt

# 文件第6行上一行增加内容
sed '6i123' a.txt

# 以adm开头行的上一行插入内容
sed '/^adm/ihello'
4.6 给文件行添加注释
# 将2到6行添加#号注释
sed -r '2,6s/^/#/' aa.txt 
sed -r '2,6s/(.*)/#\1/' aa.txt 

# &匹配前面查找的内容 
sed -r '2,6s/.*/#&/' aa.txt

# 将行首零个或多个#换成一个# 
sed -r '3,$ s/^#*/#/' aa.txt

sed -r '3,55s/^[ \t]*#*/#/' /etc/nginx.conf 
sed -r '2,8s/^[ \t#]*/#/' /etc/nginx.conf 
4.7 sed中使用外部变量
var1=11111 
sed -ri '3a$var1' /etc/hosts 
sed -ri "3a$var1" /etc/hosts 
sed -ri 3a$var1 /etc/hosts 
sed -ri "$a$var1" /etc/hosts 
sed -ri '$a'"$var1" /etc/hosts 
sed -ri "\$a$var1" /etc/hosts
4.8 配合grep修改指定行数内容

需求:

​ 当前文件 aa.txt 中有多个同名内容 bb,但是只需要修改 cc 后面的 bb

示例:

11
bb
22
33
cc
bb
dd
bb

# 查看 cc 的行数
cc_line=`grep -n "cc"`
# 获取需要修改的 bb 的行数
bb_line=$(($cc_line+1))
4.9 在指定内容前后增加内容
# 在 123 之前增加 AAA
[root@localhost ~]# echo "123 abc 234" | sed 's/123/AAA &/'
AAA 123 abc 234

# 在 123 之后增加 BBB
[root@localhost ~]# echo "123 abc 234" | sed 's/123/& BBB/'
123 BBB abc 234

# 在 abc 之前增加 AAA 之后增加 BBB
[root@localhost ~]# echo "123 abc 234" | sed -e 's/abc/AAA &/' -e 's/abc/& BBB/'
123 AAA abc BBB 234

 
 
 
 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值