Linux文本处理之sed
sed(stream editer),流编辑器,对标准输出或文件逐行进行处理
一、语法格式:
1、stdout | sed [option] "pattern command"
2、sed [option] "pattern command" file
二、sed的选项
-n 只打印模式匹配行(静默模式)
在sed的用法中,所有来自标准输入的内容都要print到屏幕,加-n后只显示经过sed处理的内容
-e 直接在命令行进行sed编辑,默认选项(只有1个时可以省略)
-f 编辑动作保存在文件中,指定文件执行
-r 支持扩展正则表达式
-i 直接修改文件内容(重要)
三、sed中的pattern详解
匹配模式 含义
10command 匹配到第10行(例:sed -n '10p' /etc/passwd,cat -n /etc/passwd)---p代表打印print
10,20command 匹配从第10行开始,到第20行结束
10,+5command 匹配从第10行开始,到第15行结束(例:sed -n '10,+5p' /etc/passwd )
/pattern1/command 匹配到pattern1的行(例:sed -n '/\/sbin\/nologin/p' /etc/passwd)
/pattern1/,/pattern2/command 匹配到pattern1的行开始,到匹配到pattern2的行结束
10,/pattern1/command 匹配从第10行开始,到匹配到pattern1的行结束
/pattern1/,10command 匹配到pattern1的行开始,到第10行匹配结束
四、sed中的编辑命令详解
查询 p 打印
增加 a 行后追加(sed -i '/^root/,/ntp/a this is a test' passwd)
i 行前追加(sed -i '/^root/,/ntp/i AAAAA BBBBB' passwd)
r 外部文件读入,往后追加
w 匹配行写入外部文件
删除 d 删除
修改 s/old/new 将行内第一个old替换为new
s/old/new/g 将行内全部的old替换为new
s/old/new/2g 将行内从2个开始到剩下所有的old替换为new
s/old/new/ig 将行内old全部替换为new,忽略大小写
s#...#...#
s_..._..._
即命令s后可以跟任意字符,只要跟替换内容不重复即可。这样,路径里的/就不再需要转义了。
sed中引用变量时注意事项:
(1)、匹配模式中存在变量,则建议使用双引号;
(2)、sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号
五、利用sed查询特定内容
查询命令 含义
1p 打印第1行内容
1,10p 打印1行到10行的内容
1,+5p 打印1行到6行的内容
/pattern1/p 打印匹配到pattern1的行内容
/pattern1/,/pattern2/p 打印匹配到pattern1的行直到匹配到pattern2的所有行内容
10,/pattern1/p 打印第10行直到匹配到pattern1的所有行内容
/pattern1/,10p 打印匹配到pattern1的行到10行的所有行内容
六、利用sed删除特定内容
删除命令 含义
1d 删除第1行内容
1,10d 删除1行到10行的内容
1,+5d 删除1行到6行的内容
/pattern1/d 删除匹配到pattern1的行内容
/pattern1/,/pattern2/d 删除匹配到pattern1的行直到匹配到pattern2的所有行内容
10,/pattern1/d 删除第10行直到匹配到pattern1的所有行内容
/pattern1/,10d 删除匹配到pattern1的行到10行的所有行内容
1、删除配置文件中的#开头注释行和空行
sed -i '/^#/d;/^$/d' file(nginx.conf)
sed -i '/[:blank:]*#/d' file(#前有0个或多个空格)
2、在配置文件中所有不以#开头的行前面添加*号
sed -i 's/^[^#]/\*&/g' file---反向引用&
七、利用sed修改文件内容
编辑命令 含义
1s/old/new 替换第1行内容old为new
1,10s/old/new 替换1行到10行的内容old为new
1,+5s/old/new 替换1行到6行的内容old为new
/pattern1/s/old/new 替换匹配到pattern1的行内容old为new
/pattern1/,/pattern2/s/old/new 替换匹配到pattern1的行直到匹配到pattern2的所有行内容old为new
10,/pattern1/s/old/new 替换第10行直到匹配到pattern1的所有行内容old为new
/pattern1/,10s/old/new 替换匹配到pattern1的行到10行的所有行内容old为new
实际应用
sed -i 's/[0-9]*//g' file(通篇搜索,0个或多个数字替换为空---正则表达式)
八、利用sed追加文件内容