Shell之sed文本处理

sed基本用法:作用/格式/定址方式
sed过滤指令:常见的处理动作
文本块处理:插入/替换行、多行文本

sed文本处理

Stream EDitor,流式编辑器
    非交互,基于模式匹配过滤及修改文本
    逐行处理,并将结果输出到屏幕
    可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种操作(vim无法在脚本中使用)

一、sed基本用法

语法格式:
    	格式1:命令 | sed [选项] '编辑指令'
    	格式2:sed [选项] '编辑指令' 文件 .. ..       #编辑指令->[定址符]处理动作
                                                										 #定址符->[地址1,[地址2]]
示例:
$ grep ^s /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ sed -n '/^r/p' /etc/inittab
root:x:0:0:root:/root:/bin/bash                   #列出以r开头的行
常见命令选项
	    -n: 屏蔽 默认输出全部文本 -> 只输出与条件匹配的结果
	    -i: 直接修改文件内容
	    -e: 可指定多个处理动作
	    -r: 启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
	    {}: 可组合多个命令,以分号分隔

定址符,即[地址1,[地址2]]
        用来指定处理的起、止行数(起始位置、结束位置)
        省略定址符时,默认逐行处理全部文本
        地址可表示为文本的“行号”,或者用来匹配的“/正则表达式/”
示例:
$ sed -n '2,4p' /etc/hosts          //输出第2-4行
$ that require network functionality willfail.
127.0.0.1       localhost.localdomain localhost
::1       localhost6.localhost6 localhost6

二、sed过滤指令

1.处理动作

操作符用途指令示例
p打印行2,4p 输出2、3、4行
2p;4p 输出第2行、第4行
d删除行2,4d 输出第2、3、4行
s字符串替换s/old/new/ 将每行的第1个old替换为new
s/old/new/g 将所有的old都替换为new

[]替换操作的分隔符“/”可改用其他字符,如#、&等,便于修改文件路径(适用场景:old串中包含文件路径、避免混淆)

2.处理动作-打印

示例含义解析
sed -n ‘p’ a.txt输出所有行,等同于cat a.txt
sed -n ‘4p’ a.txt输出第4行
sed -n ‘4,+10p’ a.txt输出第4行及其后的10行内容
sed -n ‘/^bin/p’ a.txt输出以bin开头的行
sed -n ‘p;n’ a.txt输出奇数行,n表示读入下一行文本(隔行)
sed -n ‘n;p’ a.txt输出偶数行,n表示读入下一行文本(隔行)
sed -n ‘$=’ a.txt输出文件的行数

3.处理动作-删除

示例含义解析
sed ‘3,5d’ a.txt删除第3-5行
sed ‘/xml/d’ a.txt删除所有包含xml的行
sed ‘/xml/!d’ a.txt删除不包含xml的行,!符号表示取反
sed ‘$d’ a.txt删除文件的最后一行
sed ‘/^$/d’ a.txt删除所有空行
sed ‘/^$/{n;/^$/d}’ a.txt删除重复空行,连续两个空行只保留一个

[]此例中只作输出,不更改原文件(若需要更改,应添加选项-i)

4.处理动作-替换

示例含义解析
sed ‘s/xml/XML/’ a.txt将每行中第一个xml替换为XML
sed ‘s/xml/XML/3’ a.txt将每行中的第三个xml替换为XML
sed ‘s/xml/XML/g’ a.txt将所有的xml都替换为XML
sed ‘s/xml//g’ a.txt将所有的xml都删除(替换为空串)
sed ‘s/doc/&s/g’ a.txt将所有的doc都替换为docs,&代表查找串
sed ‘4,7s/^/#/’ a.txt将第4-7行注释掉(行首加#号)
sed ‘s/^#an/an/’ a.txt接触以#an开头的行的注释(去除行首的#号)

[]此例中只作输出,不更改原文件(若需要更改,应添加选项-i)
5.sed实际应用1

1)修改网站根目录:将/var/www/html修改为/opt/wwwroot
$ grep "^DocumentRoot" /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"    	# 修改前
$ sed -i 's#/var/www/html#/opt/wwwroot' \
/etc/httpd/conf/httpd.conf        			  # 修改操作;#号为分隔符,避免与路径分隔符混淆
$ grep "^DocumentRoot" /etc/httpd/conf/httpd.conf
DocumentRoot "/opt/wwwroot"      # 修改后

三、文本块处理

1.sed文本块处理1

操作符用途指令示例含义解释
i行前插入文本2iYY在第2行之前添加文本行
4,7iYY在第4-7行的每一行前添加文本行
a行后插入文本2aYY在第2行之后添加文本
/^XX/aYY在以XX开头的行之后添加文本
c替换当前行2cYY将第2行的内容修改为"YY"

2.sed文本块处理2

$ cat m.txt
1111111 HelloShell
22222 IT Group
$ sed '2iXX' m.txt
1111111 HelloShell
XX              # 输入到行前
22222 IT Group
$ sed '2aXX' m.txt
1111111 HelloShell
222 IT Group
XX              # 插入到行后
$ sed '2cXX' m.txt
1111111 HelloShell
XX              # 替换指定行

3.多行文本处理

修改后的文本有多行时:  以换行符\n分隔
											    或,使用\强制换行(交互式)
$ sed -n '2cXX\nYY' m.txt
XX
YY
$ sed -n '2cXX\
> YY' m.txt
XX
YY

4.sed行替换 实际应用——修改主机名

  1. 找到主机名配置文件中的HOSTNAME行
  2. 整行替换为新的主机名设置
$ grep ^HOSTNAME /etc/sysconfig/network
HOSTNAME=svr5.hiai.com      		# 修改前
$ sed -i '/^HOSTNAME/cHOSTNAME=mysvr.hi\
ai.com' /etc/sysconfig/network   # 整行替换操作
$ grep ^HOSTNAME /etc/sysconfig/network
HOSTNAME=mysvr.hiai.com     	   # 修改后
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值