################人生最大的幸福就是干自己喜欢的事,此刻我就很幸福################
问题1:什么是sed?
问题2:sed的作用!
###########################################################################
(1)基本概念
sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有改变,除非你使用重定向存储输出。
特点:模式空间内容(实际只有一行)用sed命令处理,然后标准输出,接着将下一行内容读进模式空间进而处理!
作用:sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
ed:行编辑器,它将整个文件一次性的读入自己的缓冲区,对该副本执行指定的操作,并可选地将缓冲区写到磁盘!
(2)sed命令的常用语法
sed的命令格式: sed [option] 'sed command'filename
sed的脚本格式: sed [option] -f|e 'sed script'filename
(3)sed命令常用的option(参数)
-n :只打印模式匹配的行
备注:由于没有被sed命令处理的行,默认也会出现在控制台,而我们只想得到被sed命令处理过的行内容,需要-n的参数!
注意:如果是删除(d)命令的时候,标准输出就是所需要的,所以此时不需要加-n,不然没有任何输出!
###############
-e :直接在命令行模式上进行sed动作编辑(edit-->编辑文件才能用),此为默认选项;或者脚本
说明:表示多重编辑选项
sed '2,$d' /etc/passwd |sed 's#root#wzj#g'
# wzj:x:0:0:wzj:/wzj:/bin/bash
sed -e '2,$d' /etc/passwd -e 's#root#wzj#g'
# wzj:x:0:0:wzj:/wzj:/bin/bash
###############
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
###############
-r :支持扩展表达式,明确哪些扩展!
理解:就是grep的扩展egrep的形式!
###############
-i :直接修改文件内容,要慎重!
###################################
练习1:n参数的说明
说明:体会加不加n的区别!
练习2:e参数的说明
测试:加了-e可以在同一行里执行多条命令
说明:在前一个command命令的处理的基础上再进行处理!
练习3:i参数的说明
对比实验1:i参数重定向自身:
说明:流编辑器与ed编辑器的区别,sed编辑器是一次读取一行一行到内存,所以空无一物!
对比实验2:i参数重定向到非文件本身
练习4:f参数的说明
说明:文件名随便起,没有特殊的含义!
小发现:如果以sed为后缀名,竟然会有语法校验,侧面印证了sed也可以作为独立的脚本!
(3)sed的动作命令
a :追加(append), a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行);多行内容呢?
c :取代(change), c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除(delete), 模式删除,d后面通常不接任何咚咚;
i :插入(insert), i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)!
p :打印(print), 即将某个选择的数据印出,通常 p 会与参数 sed -n 一起运行!
s :替换(substitue),通常这个s的动作可以搭配正规表示法(比较重要)!
n :读如下一行输入行,从下一行进行处理
! :取反
# 用法 number+[a,i,c,d]等
s--->替换标记
g:全局替换;
w /file:将替换的结果保存至指定文件中;sed -i 's/pattern/replaces/w my.txt' test 将替换后的结果保存到my.txt中
p:显示替换成功的行;
(4)需求
#########分割1############
需求1:在文件中查询文本
语法:/
pattern
{
sed-commands
}
相关参数:p和n
# 取最后一行
sed -n '$p' /etc/passwd
tail -n1 /etc/passwd
补充:查询到了,用sed的command命令作进一步的处理!
需求2:将root替换成Java
说明:注意{}块的骚操作!
备注:其实应该经常使用的是模式查找,涉及正则表达式!
模式的类型:
解释:所有在模板root和lp所确定的范围内的行都被打印;
细节:如果root出现在lp后面的行中,从root开始到下一个lp,无论这个lp出现在哪里,二者之间的行都被打印;
接上:如果从root开始到文件的末尾还没有出现lp,那么从root到末尾的所有行都将打印
补充:
说明:"!"表示后面的命令对所有没有被选定的行发生作用,反向选择!
sed -n '/^$/!p' fstab # 打印不是空行的行-->"/^$/!"是一个模式!
备注:$表示最后一行!
# 打印匹配该模式的行号 nl passwd|sed -n '/root/='
需求:奇偶行打印
等价方式
说明:从第1行开始,~number表示步长
需求:只将第一个root替换成wzj,然后退出
# sed '/root/{s/root/wzj/;q}' passwd
说明:多个命令即可以用-e来连接也可以用;来连接!
过程:当模板root在某一行被匹配,替换命令首先将root替换为wzj,然后再用q退出sed
#########分割2############
需求2:替换文件的内容
核心:模式查找
替换标记
g:全局替换--->如果一行有多个匹配的模式,而需要全部改变,则必须加上该参数,否则只替换第一个匹配。
w:将替换的结果保存至指定文件中;
p:显示替换成功的行;
n:读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
P:打印pattern space中的第一行;
q:退出sed;
说明:因为不可能记住所有的特殊字符,为了避免特殊字符的转义,可以自定义。
s后面的字符一定是分隔搜索字符串和替换字符串的分隔符,默认为斜杠"/",但是在s命令使用的情况下可以改变。不论什么字符紧跟着s命令都认为是新的分隔符。
应用场景:这个技术在搜索反斜杠的模板时非常有用,例如搜索时间和路径的时候
sed 's@root@wzj@g' passwd
#########分割3############
需求3:追加文件的内容
明确:2可以换成模式
说明:追加当前行的下一行,可以通过\n特殊的字符进行换行!
#########分割4##########
需求:c改变文件的行内容
对比:c(change)是模式匹配行的替换,而不是行的局部数据,而s是行的局部数据的变化!
#########分割5##########
需求:删除(d)的操作
sed '/^$/d' fstab --->删除空行
sed '1,4d' fstab --->删除1,4行
说明:是模式匹配后,删除行!
#########分割6##########
i的参数同上--->略过!
#########分割7##########
sed 'G' file ---->每一行的下面出现一个空行
sed '$!G' file ---->每一行的上面出现一个空行
说明:与vim很相似!
sed的一些其它需求
sed '2,5d' 将第 2~5 行删除
sed '2d' 只要删除第 2 行
sed '3,$d' 要删除第 3 到最后一行
sed '2a drink tea' 在第二行后(亦即是加在第三行)加上『drink tea?』字
sed '2i drink tea' 在第二行前
sed -n '5,7p' 第 5-7 行或sed -n 5~7p
sed -n '/root/p' 使用-n的时候将只打印包含模板的行。
sed '/root/d' 删除/etc/passwd所有包含root的行,其他行输出
sed 's/要被取代的字串/新的字串/g'
sed -i 's/\.$/\!/g' regular_express.txt 利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成!
sed -i 's/\(.\)\{6\}$//' domain.txt 去掉每行后的6个字符
sed 's/.\{6\}//' file 去掉每行的前6个字符
sed 's/^/ 255.255.255.0 /g' /etc/passwd 每行开头添加字段
sed 's/&/ 255.255.255.0 /g' /etc/passwd 每行结尾添加字段
sed -e 4a\newLine testfile 在第四行插入新行
sed -n '5,/northeast/p' sed.txt 从第五行开始打印匹配的字符
sed -e '1,3d' -e 's/Hemenway/Jones/' sed.txt -e 执行多个编辑任务
sed '/eastern/i Hello,World! \> -----------------------------------' sed.txt i 插入
sed 's#^.*am \([a-z].*\) tea.*$#\1#g' test.txt 只保留想要的部分
stat /etc|sed -n 's#^.*(0\([0-7].*\)\/-.*$#\1#gp'
stat /etc|sed -n '4p'|awk -F '[(/]' '{print $2}
sed -e 's#[()]##g' 取括号中的内容
sed s/[[:space:]]//g 去掉空格
sed -i "/^\s*$/d" a.rb 删除空行
sed -i -c -e '/^#/d' config_file sed去除注释行
sed -i -c -e '/^$/d' config_file sed去除空行
sed -i -c -e '/^$/d;/^#/' config_file sed去空行和注释行
cat app3.txt |tr 'A-Z' 'a-z'|sed 's/$/*/g' 大小写转换并在后面添加*号
应用汇总
(1)selinux的替换
# 对指定的行进行替换!-->/etc/sysconfig/selinux出现的问题!
sed -i '7c SELINUX=enforcing' /etc/selinux/config
# 正则匹配进行替换
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sed -ir '/^SELINUX/c SELINUX=disabled/g' /etc/selinux/config
# 注意:sed –i会破坏原有文件的的软链接或硬链接--最好修改源文件,不是链接文件
教训:当你用sed –i来修改文件时,一定要修改源文件,千万不要修改它的硬链接或者软链接文件。防止破坏链接文件后,自己还一无所知
(2)非交互式的修改指定的配置文件
ssh不做DNS不解析
# 该模式进行替换,替换的内容,以前就是(7c-->第7行替换)
sed -i '/UseDNS/cUserDNS no' /etc/ssh/sshd_config
(3)清空
sed -i '1,$d' /etc/passwd # 要知道如何恢复!
> /etc/passwd
(4)将匹配的行写入到文件中
# 模式空间的重定向-->将某些信息保留!
sed '/root/w my.txt' /etc/passwd
(5)后向引用
# 获取网卡的IP-->后向引用,两部分(注意:-r参数)
ifconfig eth0|sed -n 2p |sed -r 's#^.*net (.*)(net.*$)#\1#g'
# 说明:最好将#换成/,不用转义了!
(6)删除配置文件中#开头的注释行,如果碰到tab或者空格的行是无法删除的
# 把有#号或者有Tab键的删除了-->总之该行有#号
# 任意空格加上#
sed -r '/^[ \t]*#/d' /etc/selinux/config
# 实际用的是egrep
(7)删除无内容的空行
sed -r '/^[ \t]*$/d' /etc/selinux/config
# 以任意空格开头和结束,实际用egrep
(8)删除注释行和空行
# 扩展字符
sed -r '/^[ \t]*($|#)/d' /etc/httpd/conf/httpd.conf
(9)给文件行加上注释信息
场景:文件里面有很多定时任务(脚本),执行完了,主要注释掉,过滤自己的脚本
# 先过滤自己的脚本!
# 模式-->操作
sed -i '/root/s#^#\##g' /etc/crontab
# nginx.conf的配置文件!