正则表达式定义
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
例2:g(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 '1,3d' 删除1到3行输出
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' 把1到10行大小写的所有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 对文件操作并修改源文件