赞
踩
参数 | 作用 |
---|---|
-r | 识别扩展正则符号 |
-n | 取消默认输出,只将进行操作修改的行的内容输出到屏幕 |
-i | 对文件内容进行真正的修改、删除等操作 |
-e | 根据命令的顺序多重编辑 |
[root@db01 scripts]# cat id.txt
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
根据行号
,显示某(几)行信息
##某单行信息
[root@db01 scripts]# sed -n '3p' id.txt
203,Cindy,ACCA
##连续多行信息
[root@db01 scripts]# sed -n '3,5p' id.txt
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
##不连续的多行信息
[root@db01 scripts]# sed -n '3p;5p' id.txt
203,Cindy,ACCA
205,Eric,HCIE
根据内容
,显示某(几)行信息
[root@db01 scripts]# sed -n '/Ci/p' id.txt
203,Cindy,ACCA
[root@db01 scripts]# sed -n '/Ci/,/ri/p' id.txt
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
[root@db01 scripts]# sed -n '/Ci/p;/ri/p' id.txt
203,Cindy,ACCA
205,Eric,HCIE
不修改文件,只在屏幕输出结果。
## 在第1行的上一行插入新数据 [root@db01 scripts]# sed '1i200,Kate,OFI' id.txt 200,Kate,OFI 201,Alice,CFA 202,Book,FRM 203,Cindy,ACCA 204,David,CPA 205,Eric,HCIE ##在最后一行的下一行添加新数据 [root@db01 scripts]# sed '$a206,Frank,CEO' id.txt 201,Alice,CFA 202,Book,FRM 203,Cindy,ACCA 204,David,CPA 205,Eric,HCIE 206,Frank,CEO ##也可以把上述2条命令合二为一,按照前后顺序,同时执行 [root@db01 scripts]# sed -e '1i200,Kate,OFI' -e '$a206,Frank,CEO' id.txt 200,Kate,OFI 201,Alice,CFA 202,Book,FRM 203,Cindy,ACCA 204,David,CPA 205,Eric,HCIE 206,Frank,CEO
所以得出规律:
在第x
行前面插入(insert),即为 xi
在第y
行后面加入(add),即为 ya
1可以表示为第一行
$可以表示为最后一行
连续进行一次性多个操作用-e
参数
将3.1
中的所有p换成d,即可做到相同的(输出)删除操作
p
-----print
打印,输出
d
-----delete
删除
取消空行的显示(排除空行)
命令一:sed -n '/./p' id.txt
命令二:sed -n '/^$/d' id.txt
命令三:sed -n '/^$/!p' id.txt
不修改文件,只在屏幕输出结果。
格式:sed 's#原有内容#修改后内容#g' 文件名
,此处的#
可以替换成/
等特殊字符
后项引用前项格式:sed 's#(.*)#\1#g' 文件名
。在这里,(.*)
所匹配的就是\1
的内容。
将3.2
、3.3
、3.4
中所有的写入操作中加上-i
参数,如下图所示。
sed -i 's#old#new#g' /tmp/test.txt
此时的添加内容、删除内容、修改内容就会在文件中真实执行,并且在屏幕将结果输出显示。
一般而言,对于重要文件的修改都会进行提前备份,在-i
参数后面加上.bak
即可同时将源文件进行先备份一份test.txt.bak
,再对test.txt
进行修改。
sed -i.bak 's#old#new#g' /tmp/test.txt
此外,一般在shell脚本中使用sed批量修改配置文件中,我们可能需要进行整行内容替换。
例如,某一行内容是这样的:
cat /etc/login.defs
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 30
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
此处需要将PASS_MAX_DAYS
后面的数字换成50。
在替换过程中需要注意的是,PASS_MAX_DAYS
在全文出现了两次,第一次出现在注释中,我们不能去改动,需要改的是第二个参数以及后面的内容。
经过观察可以发现,第二个参数是顶头出现的,我们要替换参数以及后面的东西,于是PASS_MAX_DAYS.*$
就是s###g
格式的第一个位置的内容,表示要替换参数以及后面的所有内容。
完整修改:sed -i.bak s#PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs
但如果是这样的:
auth PASS_MAX_DAYS 30 password
此处的参数前后都有内容,被夹在中间,则可以这么匹配。^.*PASS_MAX_DAYS.*$
完整修改:sed -i.bak s#^.*PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs
-n
参数是在查看文件内容时使用,-i
参数在真正修改文件时使用。
一般情况下,两个参数不会同时使用,也不能同时使用。
如果同时使用这两个参数,可能会使文件内容清空,是一个危险操作,请勿用错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。