ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux文本处理三剑客之sed流编辑器

2022-02-21 21:04:01  阅读:197  来源: 互联网

标签:输出 文件名 指定 文本处理 sed 文件 替换 三剑客


目录

一,sed工具

1.sed概述:

2.sed工作流程:

二,sed命令

三,示例

1.输出符合条件的文本(p表示正常输出,打印)

2.删除符合条件的文本(d)

3.替换符合条件的文本

4.迁移符合条件的文本

5.使用脚本编辑文件

四,分组操作


一,sed工具

1.sed概述:

文本处理工具,读取文本内容,根据指定的条件对文本内容进行编辑,如删除,替换,添加,移动等,最后输出所有行或仅输出处理的某些行。

也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于shell脚本中,用以完成各种自动化处理任务。

2.sed工作流程:

读取------执行-------显示

读取:从输入流(文件,管道,标准输入)中读取一行内容并存储到临时的缓冲区中(模式空间)。

执行:默认情况下,所有的sed命令都在模式空间中顺序的执行,除非指定行的地址,否则sed命令将会在所有的形上依次执行。

显示:发送修改后的内容到输出流,在发送数据后,模式空间将会被清空,在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有的内容被处理完。

注:默认情况下,所有的sed命令都是在模式空间内执行,因此输入的文件并不会发生任何变化,除非是重定向存储输出。

二,sed命令

通常情况下,"参数"是指操作的目标文件,当存在多个操作对象时,文件之间用","分隔

sed [选项] '操作' 参数

而scriptfile不是脚本文件,需要用-f选项指定,当脚本文件出现在目标文件之前,表示通过指定的脚本文件来处理输入的目标文件

sed [选项] -f scriptfile 参数
常见的sed命令选项:
-e或--expression=:表示用指定命令或脚本来处理输入的文本文件。
-f或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h或--help:显示帮助。
-n,--quiet或slient:表示仅显示处理后的结果。
-i.bak:直接编辑文本文件。
-r,-E:使用扩展正则表达式。
-s:将多个文件视为独立文件,而不是单个连续的长文件流




"操作"用于指定对文件操作的动作行为,也就是sed的命令。
通常情况下是采用的"[n1[ ,n2] ]"操作参数的格式。

n1、n2是可选的,代表选择进行操作的行数,
如操作需要在5~20 行之间进行则表示为"5,20动作行为"。

常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,册除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;
如果不指定行,则表示打印所有内容;
如果有非打印字符,则以ASCII 码输出。其通常与"-n"选项一起使用。
s:替换,替换指定字符。
y:字符转换。

三,示例

1.输出符合条件的文本(p表示正常输出,打印)

sed -n 'p' 文件名     相当于  cat  文件名 ;输出所有内容
sed -n '2p' 文件名    输出第二行
sed -n '2,5p' 文件名  输出2-5行
sed -n 'p;n' 文件名   输出所有奇数行,n表示读入下一行资料
sed -n 'n;p' 文件名   输出所有偶数行
sed -n '1,5{p;n}' 文件名  输出第1-5行之间的奇数行
sed -n '11,${n;p}' 文件名 输出第11行到文件尾之间的偶数行


结合正则表达式时,正则表达式以"/"包围
sed -n '/the/p' 文件名  输出包含the的行
sed -n '/the/=' 文件名  输出包含the的行所在的行号
sed -n '/^the/p' 文件名 输出以the开头的行
sed -n '/\<the\>/p' 文件名 输出包含单词the的行,\<,\>代表单词边界

2.删除符合条件的文本(d)

nl命令用于计算文件的行数,直观的查看命令执行的结果
nl 文件名 |sed '3d'    删除第三行
nl 文件名 |sed '3,5d'    删除第3-5行
sed '/^[A-Z]/d' 文件名   删除以大写字母开头的行
sed '/\.$/d' 文件名      删除以.结尾的行

3.替换符合条件的文本

使用sed命令进行替换操作时需要用到s (字符串替换)、c(整行/整块替换)、y(字符转换)命令选项
常见的用法如下所示。
sed 's/the/THE/' 文件名        #将每行中的第一个the 替换为THE
sed 's/l/L/2' 文件名           #将每行中的第2个l替换为L
sed 's/the/THE/g' 文件名       #将文件中的所有the 替换为THE
sed 's/o//g' 文件名            #将文件中的所有o删除(替换为空串)
sed 's/^/#/' 文件名            #在每行行首插入#号
sed '/the/s/^/#/ ' 文件名      #在包含the 的每行行首插入#号
sed 's/$/EOF/' 文件名          #在每行行尾插入字符串EOF
sed '3, 5s/the/THE/g’ 文件名   #将第3~5行中的所有the替换为THE
sed '/the/s/o/o/g' 文件名      #将包含the 的所有行中的o都替换为o
sed -i.bak's/SELINUX=disabled/SELINUX=enforing/'
/etc/selinux/config

4.迁移符合条件的文本

使用sed命令迁移符合条件的文本时,常用到以下参数.
H:复制到剪贴板;
g,G:将剪贴板中的数据覆盖/追加至指定行
w :保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
l, i:忽略大小写

sed '/the/{H;d};$G' 文件名  
#将包含the 的行迁移至文件末尾,{;}用于多个操作

sed '1,5{H;d};17G' 文件名   
#将第1~5行内容转移至第17行后

sed '/the/w out.file' 文件名 
#将包含the 的行另存为文件 out.file

sed '/the/r /etc/hostname' 文件名  
#将文件/etc/hostname 的内容添加到包含 the 的每行以后

sed '3aNew' 文件名       
#在第3行后插入一个新行,内容为New

sed '/the/aNew' 文件名   
#在包含the 的每行后插入一个新行,内容为New

sed ' 3aNew1 \nNew2' 文件名  
#在第3行后插入多行内容,中间的\n表示换行

5.使用脚本编辑文件

sed '1,3{H;d};9G' 1.txt//将第1~3行内容转移至第9行后

以上操作可以改用脚本文件方式:
[ root@localhost ~]# vi ceshi.list 
1,5H
1,5d
16G
[root@localhost ~]# sed -f ceshi.list 1.txt
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross !
Actions speak louder than words

#woood ##woooooood #AxyzxyZxyZxyzC
I bet this place is really spooky late at night! Misfortunes never come alone/single.
l shouldn't have lett so tast.

6.直接操作文件

编写脚本,用来调整vsftpd服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。
[root@localhost ~]# vim local_only_ftp.sh
#!/ bin/bash
#指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET SITE/vsftpd.conf "
CONFIG="/etc/vsftpd/vsftpd.conf"
#备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存在,若不存在则使用cp命令进行文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak 
#基于样本配置进行调整,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g'$SAMPLE >$CONFIG
sed -i -e ' /^local_enable/s/NO/YES/g' 
-e ' /^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES'$CONFIG
#启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd 
systemctl enable vsftpd
[root@localhost ~]# chmod +x local_only_ftp.sh

四,分组操作

对一行数据进行多次操作的时候我们可以使用{}进行分组
sed '/root/ {s/root/ROOT/;s/x/X/g}' /etcpasswd

sed -ne '/root/{s/root/ROoT/ ; s/x/X/g} ' -ne '1,10p'/tmp/passwd

echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/’
#分组s//代表查找替换    ()代表分组    \1代表留下的组

ifconfig ens33 | sed -rn '2s /.*inet ( [0-9.]+).*/\1/p'

sed -r s/^[\t]*/#/ letc/ hosts.bak

标签:输出,文件名,指定,文本处理,sed,文件,替换,三剑客
来源: https://blog.csdn.net/qingqui_/article/details/123055737

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有