shell编程之sed

正则表达式定义

1、正则表达式,又称正则表达式、常规表达式
2、使用字符串来描述、匹配一系列符合某个规则的字符串
3、正则表达式组成
普通字符
大小写字母、数字、标点符号及一些其他符号
元字符
在正则表达式中具有特殊意义的专用字符

正则表达式基础元字符

\: 转义字符,\!、\n等
^: 匹配字符串开始的位置
  例:^a、^the、^#
$:匹配字符串结束的位置
  例:word$
.: 匹配除\n之外的任意的一个字符
  例:go.d、g..d
*: 匹配前面子表达式0次或者多次
  例:goo*d、go.*d
[list]:匹配list列表中的一个字符
  例:go[ola]d,[abc][a-z][a-z0-9]
[^list]:匹配任意不在list列表中的一个字符
  例:[^a-z][^0-9][^A-Z0-9]
^[] :匹配括号内单个或多个字符开头
^[^ ]:匹配不以括号内单个或多个字符开头
\< :匹配以...开头的行
\> :匹配以...结尾的行
\<....\> :匹配某一个单词的行
\{n,m\}:匹配前面的子表达式n到m次,有\{n\}、\{n,\}、\{n,m\}三种格式
  例:go\{2\}d、go\{2,3\}d、go\{2,\}d

在这里插入图片描述
\{n\} :n是几次,就是出现几次
\{n,\} :至少出现n次
\{,m\} :至多出现m次
\{n,m\} : 至少出现n次,至多出现m次
<…> :精确匹配里面的内容

扩展正则表达式元字符

扩展元字符用egrep

+ :匹配前面子表达式1次以上
   例:go+d,将匹配至少一个o
? :匹配前面子表达式0次或者1次
   例:go?d,将匹配gd或god
():将括号中的字符串作为一个整体
   例:(xyz)+,将匹配xyz整体1次以上,如xyzxyz
| :以或的方式匹配字条串
   例1:good|food,将匹配good或者food
   例2g(oo|la)d,将匹配good或者glad

?在匹配单个字符的情况下只可匹配0次或1次,而在匹配单词时,可匹配0次或无数次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sed 流编辑器

sed工具概述

1、文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
2、可在无交互的情况下实现相当复杂的文本处理操作
3、被广泛应用于shell脚本,以完成自动化处理任务
4、sed依赖于正则表达式
5、工作原理:读取→执行→显示

sed的工作原理

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓

冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理

完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件

内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化

对文件的反复操作。

sed命令

sed -e '编辑命令' 文件1 文件2
sed -n -e '编辑命令' 文件1 文件2
sed -i -e '编辑命令' 文件1 文件2
-e 指定要执行的命令,只有一个编辑命令时可省略
-n 只输出处理后的行,读入时不显示
-i 直接编辑文件,而不输出结果
-f 用指定的脚本文件来处理输入的文本文件
sed '' 文件  输出所有行
sed 'p' 文件  打印再逐行打印 (所以会有两遍)
sed -n 'p' 文件  输出 不让打印 (所以只有一遍)
sed -n '1p' 文件  只输出第一行
sed -n '1,3p' 文件  输出一到三行
$p 最后一行
sed -n '1,+4p' 文件  输出第一行以及后四行
sed -n '1~2p' 文件  输出第一行往后每第二行输出
sed -n ‘2p;3p;5p’ 文件  输出第二、三、五行

sed -n ‘/root/p’   输出有root的行
sed -n ‘/^root/p’   输出root开头的行
sed -n ‘/bash$/p’   输出bash结尾的行
sed -n ‘/^root\|bash$/p’  输出root开头或者bash结尾的行
如果上面的命令不想加转义字符就用-r
sed -nr ‘/^root|bash$/p’

-e 支持多条件匹配
sed -ne '/^root/p' -e '/bash$/p'   输出root开头或者bash结尾的行

sed -n '/^$/p'  输出空行
sed -n '/ /p'   输出有空格的行

sed -n '/\/bin\/bash\/'  输出有/bin/bash的行
sed -n 'p#/bin/bash#'    输出有/bin/bash的行
sed -n 's#/bin/bash#bbbb#p'  输出有/bin/bash的行并替换成bbbb   (#也可用@或者,代替)

sed -n ‘10d’  删除第十行 (不删除源文件)
sed -n 'd'   删除所有行  (不删除源文件)
cat xxx.txt | sed '10d'    删除第10行输出(不删除源文件)
cat xxx.txt | sed '13d'  删除13行输出
cat xxx.txt | sed '/root/d' 删除有root的行
cat xxx.txt | sed -n 's/ROOT/xxx/pi' 把有大小写的root开头替换成xxx
cat xxx.txt | sed -n 's/ROOT/xxx/gpi' 把有大小写的所有root替换成xxx
cat xxx.txt | sed -n '/ROOT/Ip'  输出包含大小写root的行
cat xxx.txt | sed -n '10s/ROOT/xxx/gpi' 把第10行大小写的所有root替换成xxx
cat xxx.txt | sed -n '1,10s/ROOT/xxx/gpi' 把110行大小写的所有root替换成xxx
sed -n 's/^bin/#&/p' xxx.txt  把bin开头的替换成#bin  (&表示对应前面的bin)
echo hello world gg | sed -nr 's/(hello) (world) (gg)/\2 \1 \3/p' 调换位置
echo hello world gg | sed -nr 's/(hello) (world) (gg)/\1 the \2/p'   输出hello the world gg
sed -n '1a hello world' xxx.txt  在第一行下面插入hello world
sed -n '1i hello world' xxx.txt  在第一行上面插入hello world
sed -n 'a hello world' xxx.txt  在每一行下面插入hello world
sed -n '/root/a hello world' xxx.txt  在有root的行下面插入hello world
sed -n '1,3a hello world' xxx.txt  在一到三行每行下面插入hello world


sed -i  改入原文件
sed -i.bak '1,3a xxxxx' xxx.txt  把xxx.txt生成备份xxx.txt.bak(是没改之前的备份)

sed '1,3r /etc/hosts' xxx.txt  在第一行到第三行下面都读取 hosts文件
sed '/root/r /etc/hosts' xxx.txt  在root的行下面都读取 hosts文件

sed 'w/opt/bak' xxx.txt  把txt文件读取保存到/opt/bak文件里(它这个是覆盖)


sed 's/root/cxxx' zz.txt  把有root的整行替换成xxx

sed '=' zz.txt   打印行号
sed '$=' zz.txt   打印最后一行的行号

sed '5q' zz.txt  读取到第五行结束



逐行的原理
在这里插入图片描述

sed写入脚本

**sed写入脚本 ,脚本上面就不是#!/bin/bash ,而是 #/bin/sed -f **

写入脚本的代码也不需要在前面加sed -n 之类的 直接写入后面单引号里的代码
在这里插入图片描述

如何运行sed 脚本

sed -f sed.sh xx.txt
sed -i -f sed.sh xx.txt  对文件操作并修改源文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值