首页 技术 正文
技术 2022年11月18日
0 收藏 892 点赞 3,437 浏览 3737 个字

sed是一个非交互式的文本编辑器;sed一行一行的处理文件sed有模式空间(主要活动空间)和缓存空间(辅助空间)两个空间:模式空间(pattern space)将文件中的一行内容读取到临时缓冲区(模式空间),经过处理后进行输出并清空空间内容;保持空间(hold space):保持空间不会自动清空也不会主动打印,需要通过命令和模式空间进行交互,主要用于sed的高级命令处理,是sed的辅助空间。 sed的基础应用 一、正则表达式很多工具语言都支持使用正则表达式,但是sed中有些正则不能用,sed不支持\d类、\D、\W反义类,零宽断言、懒惰(非贪婪)模式 sed中使用正则表达的注意点1.sed默认为贪婪模式,不支持懒惰模式2.sed中使用正则表达式注意sehll特殊字符冲突问题,比如\(exp\),但是可以使用-r参数解决冲突3.sed中不支持使用\d和反义的\W等表达方式 下面是正则表达式的一些基础内容【元字符】.     匹配换行符之外的任意字符\w     匹配字母、数字、下划线或汉字\s     匹配任意的空白符\d     匹配数字\b     匹配单词的开始和结束^     匹配字符串的开始$     匹配字符串的结束\     转义字符(比如想要匹配.的时候需要进行转义)【限定符】*     重复0或更多次+     重复1次或更多次?     重复0次或1次{m}     重复m次{m,}     重复m次或更多次{m,n}     重复m到n次{,n}     重复0次到n次[1-9]     指定范围内的字符,1-9范围内的,或者a-z,A-Z,或者用逗号隔开的字符【反义符】(大写的与元字符内容相反)\W     匹配任意不是字母、数字、下划线、汉字的字符\S     匹配任意不是空白符的字符\D     匹配任意不是数字的字符\B     匹配任意不是单词开头和结束的位置[^xyz]     匹配除了xyz这几个字母以外的任意字符【捕获】(exp)    匹配exp,通过小括号捕获文本到自动命名的组里。(?<name>ex)     匹配ex,并捕获文本到名称为name的组里(?:exp)     匹配exp,不捕获匹配的文本,也不分配组号【零宽断言】(?=exp)     匹配exp前面的位置(?<=exp)     匹配exp后面的位置(?!exp)     匹配后面跟的不是exp的位置(?<!exp)     匹配前面跟的不是exp的位置【贪婪与懒惰】*?     重复任意次,但尽可能少的重复+?     重复1次或更多次,但尽可能少的重复??     重复0次或1次,但尽可能少的重复{n,m}?     重复n到m次,但尽可能少的重复{n,}?     重复n次以上,但尽可能少的重复 二、sed基础命令1.sed的命令格式sed [-options] [commands] filenamesed [-options] –f scriptfile filename command格式:[address-range] [pattern-to-match] [sed-command]例如:sed -n ‘5,8p’ passwd(打印passwd文件中第5到第8行的数据) 下面是一个命令格式的图:sed的基础应用 说明:1.sed命令的寻址和正则表达式不是必填项2.行号寻址:(line1,line2)使用m,n表示通过行号寻址,读取文件m到n行(例如5,8);如果只有一个数字m表示读取第m行3.正则表达式寻址:(/pattern/ ),使用/pattern/来匹配行,正则需要放到//中。如果用到了()[]等需要用\进行转义;也可以使用sed的-r参数,这样就不需要转义了4.使用行号和正则来寻址:(line1,/pattern/),来寻找line1行到匹配到/pattern/的行,如果找不到/pattern/则从line1开始一直读取到结束 【sed的-options】-n     抑制输出,只打印匹配到的行。如果不加-n会打印出一行行读入缓冲区后默认打印的所有行。     例如下面的打印passwd文件以bash结尾的内容:     不加-n:     sed的基础应用     加-n:     sed的基础应用sed的基础应用-i     修改原文件。比如删除d,追加a,修改等-r     正则匹配时,不需要对()进行转义了-e     多重编辑。sed -e ‘1,3d’ -e ‘s/abc/def/g’ filename     【sed的command的命令】p     打印d     删除(如果需要直接操作原文件,需要用到sed -i 操作)s     1.提取内容,s/正则表达式/\1\2/p。s/(.*)/\1/p(\1表示捕获第一个小括号内的内容。\n来表示第n个捕获的内容)       2.替换内容,s/要替换的内容/替换的内容/g。如果用g表示全局替换,不加g只替换找到的第一个字符串i     在匹配的行前加入一行。sed -i ‘5i\要插入的内容\’ filenamea     在匹配的行后追加一行。sed  -i ‘5a\要追加的内容\’ filename   如果是要在匹配到的正则后追加一行: sed -ie ‘/正则内容/a\”要追加的内容”‘ filename       如果要追加的内容共使用了变量,需要用\对$进行转义,正则中的不需要加\:sed -ie “/$a/a\\$b” filename   sed的基础应用c     修改匹配到的行。sed -i ‘5c\要修改的内容’ filenamey     转换符。y/要转换的字符/转换后的字符/。注意:要转换的字符和转换后的字符个数是相等的,且是一一对应的关系。如果有多个字符要转换,他会按照命令中的位置将对应的字符全部转换成转换后的样子q     退出。不再进行sed处理w     写到新文件。sed ‘/要匹配的行/w newfile’ filename 2.sed命令的实战【查找】例子:查找passwd文件中以bash结尾的行并打印出来sed -n ‘/bash$/p’ passwd【删除】例子:删除passwd中以test开头的行sed -i ‘/^test/d’ passwd【打印】例子:打印passwd文件中第3到第8行的内容sed -n ‘3,8p’ passwd【提取】例子:提取passwd中有登录shell(结尾为bash)的用户名及其家目录下面两种写法结果都一样。s命令前可以先用正则匹配行sed -rn ‘s/(.*)[x:0-9]*([\/a-z]*):\/bin\/bash$/\1 \2/p’ passwdsed -nr ‘/bash$/s/(\w+):\w:[0-9]+:[0-9]+:.*:(.*):.*/\1 \2/p’ passwd【替换】例子:将passwd文件中的nologin全部替换为meitiansed -i ‘s/nologin/meitian/g’ passwd注意:如果不加g则只会替换第一个字符串,加g是全局的进行替换【插入】例子:在passwd第5行上插入一行hello worldsed -i ‘5i\hello world’ passwd例子:在psswd第5行下面追加一行hello worldsed -i ‘5a\hello world’ passwd【修改】例子:将第5行的内容修改为hello worldsed -i ‘5c\hello world’ passwd【转换】例子:将abcdef转换成对应的数字123456echo “aaddddxxxxaacfedbsdf”| sed ‘y/abcdef/123456/’sed的基础应用sed的基础应用【退出】例子:passwd文件,处理到第5行退出sed ‘5q’ passwd 三、实战中的一些注意点1.在sed命令中使用变量($a类型),sed后面的命令必须使用双引号括起来,否则$会被当成普通字符    例子:将passwd文件中的root变更为变量name中的值    sed -i “s/root/$name/g” passwd     sed的基础应用2.修改内容时,可以使用正则的()捕获内容,然后通过\1等简化要修改的脚本    例子:去掉hosts文件前所有行前面的#号    sed -i ‘s/^#(.*)/\1/g’ hosts3.将sed提取到的值赋值到变量     例子:将本机的IP地址赋值到变量ip。     方法一:使用变量名=$(打印变量值)     ip=$(ifconfig eth0 | sed -nr ‘s/\s+inet addr:([0-9]+.[0-9]+.[0-9]+.[0-9]+) .*/\1/p’sed的基础应用  sed的基础应用     方法二:使用eval $(打印变量名=变量值)     eval $(ifconfig eth0 | sed -nr ‘/inet/s/\s+inet addr:([0-9]+.[0-9]+.[0-9]+.[0-9]+) .*/ip=\1/p’ )4.sed命令在使用时会在当前处理的文件目录下生成一个缓存文件,但是有的文件目录只有root有权限。如果我们没有root权限,也不知道sudo的密码。可以将文件先cp到一个有权限的目录下进行操作,然后文件处理后再cp回来。  sed还有很多高级命令,比如G等,可以再多了解一下,以便达到更高效的使用。用了awk和sed后,我个人觉得如果只是对数据进行提取,用awk更灵活更方便。而对一个文件进行编辑修改,还是用sed更方便一些。各有各的好处。另外在使用awk处理文件时会感觉处理过程有点慢。 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,905
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,430
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,247
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,058
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,690
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,727