shell之路 Linux正则工具【第二篇】文本处理三剑客之sed
作用
查找或修改符合模式匹配规则(pattern)的所有行
命令格式
第一种形式:sed [option] "pattern command" file
第二种形式:stdout | sed [option] "pattern command"
常用选项
-n 只打印模式匹配行 -e|; 多条命令 -r 支持扩展正则表达式 -i 直接修改文件内容
sed -n '/pattern/p' f 打印匹配的行 sed -i∶直接修改读取的文件内容,而不是由屏幕输出 sed 'm,ns/keyword1/keyword2/g' f 替换(m,n)行(/分隔符可为其它如#) sed -r 's/(keyword1)(keyword2)/g' f s代表替换,g代表替换一行的所有 sed -n '/keyword1/p;/keyword2/p' f sed -n -e '/keyword1/p' -e '/keyword2/p' f
sed中的pattern详解
匹配模式 含义 10command 匹配到第10行 10,20command 匹配从第10行开始到第20行结束 10,+5command 匹配从第10行开始到第16行结束 /pattern1/command 匹配到pattern1的行 /pattern1/,/pattern2/command 匹配到pattern1的行开始 10,/pattern1/command 到匹配到pattern2的行结束匹配从第10行开始 /pattern1/,10command 到匹配到pettern1的行结束匹配到pattern1的行开始,到第10行匹配结束
pattern用法: 1、LineNumber ----直接指定行号 sed -n "17p" file 打印file文件的第17行 2、startLine , EndLine ---指定起始行号和结束行号 sed -n "10,20p" file 打印file文件的10到20行 3、startLine, +N ---------------指定起始行号,然后后而N行 sed -n "10,+5p" file 打印file文件中 从第10行开始,往后面加5行的所 4、/pattern1/ ----正则表达式匹配的行 sed -n "/^root/p" file 打印file文件中以root开头的行 5、/pattern1/,/pattern2/ -------从匹配到pattern1的行, 到匹配到pattern2 sed -n "/^ftp/ ,/^mai1/p" file 打印fi1e文件中第一个匹配到以ftp开头的行,到第二行 6、LineNumber , /pattern1/ ----从指定行号开始匹配,直到匹配到pattern1 sed -n "4,/^hdfs/p" file 打印file文件中从第4行开始匹配,直到以hdfs开头的行 7、/pattern1/,LineNumber --从pattern1匹配的行开始,直到匹配到指定行 sed -n "/root/ ,10p" file 打印file文件中匹配root的行,直到第10行结束
sed中的编辑命令详解
查询(常用): 1、P ----------打印 删除: 2、d ----------删除 增加: 3、a ---------匹配到的行后追加内容 4、i ----------匹配到的行前追加内容 5、r ---将后面指定文件的内容追加到匹配到的行后面 6、w ----------将匹配到的行内容另存到其他文件中 修改(常用): 7、 s/pattern/ string/ -----------查找并替换,查找符合pattern模式的字符串,将其 s/pattern/ string/g -----------g表示全 部行内全部匹配 s/pattern/ string/2g -----------2g表示,同一行内,只替换前2个匹配的,剩下的 s/pattern/string/ig ------------加i参数表示匹配时忽略大小写,g表示匹配到的: 其他编辑命令: 8、= --显示行号 什么是反向引用? &和\1 引用模式匹配到的整个串 sed "s/l..e/&r/g" file 在file中搜寻以1开头,然后跟两个任意字符,以e结尾的字符串 sed "s/\(1..e\)/\1r/g" file 和上面实现- ~样的功能,使用\1代表搜寻到的字符串.\ 上面两种方式实现了一样的功能,分别使用&和\1引用前面匹配到的整个字符串 两者区别在于&只能表示匹配到的完整字符串,只能引用整个字符串;而\1可以使用()对匹配到的字符串 例如:如果我们仅想要替换匹配到的字符串的一~部分,name必须使用\1这种方式,不能使用&。 查找test. txt文件中以1开头,紧接着跟两个任意字符,再接一个e的字符串。将找到的字符串中开头的 sed "s/1\(. .e\) /L\1/g" test. txt
案例
查找
替换
不修改原文件并输出
修改原文件
谢谢