Shell 编程四剑客之 SED
- 概述
- 语法参数格式为:
- 常用 SED 工具企业演练案列:
- (1) 替换 jfedu.txt 文本中 old 为 new:
- (2) 打印 jfedu.txt 文本第一行至第三行:
- (3) 打印 jfedu.txt 文本中第一行与最后一行:
- (4) 删除 jfedu.txt 第一行至第三行、删除匹配行至最后一行:
- (5) 删除 jfedu.txt 最后 6 行及删除最后一行:
- (6) 删除 jfedu.txt 最后一行:
- (7) 在 jfedu.txt 查找 jfedu 所在行,并在其下一行添加 word 字符,a 表示在其下一行添加字符串:
- (8) 在 jfedu.txt 查找 jfedu 所在行,并在其上一行添加 word 字符,i 表示在其上一行添加字符串:
- (9) 在 jfedu.txt 查找以 test 结尾的行尾添加字符串 word,$表示结尾标识,&在Sed 中表示添加:
- (10) 在 jfedu.txt 查找 www 的行,在其行首添加字符串 word,^表示起始标识,&在Sed 中表示添加:
- (11) 多个 sed 命令组合,使用-e 参数:
- (12) 多个 sed 命令组合,使用分号“;”分割:
- (13) Sed 读取系统变量,变量替换:
- (14) 修改 Selinux 策略 enforcing 为 disabled,查找/SELINUX/行,然后将其行enforcing 值改成 disabled、!s 表示不包括 SELINUX 行:
- SED 高级命令可以分为三种功能:
- (1) 在 jfedu.txt 每行后加入空行,也即每行占永两行空间,每一行后边插入一行
- (2) 将 jfedu.txt 偶数行删除及隔两行删除一行:
- (3) 在 jfedu.txt 匹配行前一行、后一行插入空行以及同时在匹配前后插入空行:
- (4) 在 jfedu.txt 每行后加入空行,也即每行占永两行空间,每一行后边插入空行:
- (5) 在 jfedu.txt 每行后加入空行,也即每行占永两行空间,每一行后边插入空行:
- (6) 在 jfedu.txt 每行前加入顺序数字序号、加上制表符\t 及.符号:
- (7) 删除 jfedu.txt 行前和行尾的任意空格:
- (8) 打印 jfedu.txt 关键词 old 与 new 之间的内容:
- (9) 打印及删除 jfedu.txt 最后两行:
- (10) 合并上下两行,也即两行合并:
概述
SED 是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与 VIM 编辑器类似,它一次处理一行内容,Sed 可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。
在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),紧接着用 SED 命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。
逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非你使用重定向存储输出或者写入文件。
语法参数格式为:
sed [-Options] [‘Commands’] filename;
sed 工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加-i 参数即对文件彻底修改;
参数 | 注释 |
---|---|
x | #x 为指定行号; |
x,y | #指定从 x 到 y 的行号范围; |
/pattern/ | #查询包含模式的行; |
/pattern/pattern/ | #查询包含两个模式的行; |
/pattern/,x | #从与 pattern 的匹配行到 x 号行之间的行; |
x,/pattern/ | #从 x 号行到与 pattern 的匹配行之间的行; |
x,y! | #查询不包括 x 和 y 行号的行; |
r | #从另一个文件中读文件; |
w | #将文本写入到一个文件; |
y | #变换字符; |
q | #第一个模式匹配完成后退出; |
l | #显示与八进制 ASCII 码等价的控制字符; |
{} | #在定位行执行的命令组; |
p | #打印匹配行; |
= | #打印文件行号; |
a\ | #在定位行号之后追加文本信息; |
i\ | #在定位行号之前插入文本信息; |
d | #删除定位行; |
c\ | #用新文本替换定位文本 |
s | #使用替换模式替换相应模式; |
n | #读取下一个输入行,用下一个命令处理新的行; |
N | #将当前读入行的下一行读取到当前的模式空间。 |
h | #将模式缓冲区的文本复制到保持缓冲区; |
H | #将模式缓冲区的文本追加到保持缓冲区; |
x | #互换模式缓冲区和保持缓冲区的内容; |
g | #将保持缓冲区的内容复制到模式缓冲区; |
G | #将保持缓冲区的内容追加到模式缓冲区。 |
常用 SED 工具企业演练案列:
(1) 替换 jfedu.txt 文本中 old 为 new:
sed 's/old/new/g' jfedu.txt
(2) 打印 jfedu.txt 文本第一行至第三行:
sed -n '1,3p' jfedu.txt
(3) 打印 jfedu.txt 文本中第一行与最后一行:
sed -n '1p;$p' jfedu.txt
(4) 删除 jfedu.txt 第一行至第三行、删除匹配行至最后一行:
sed '1,3d' jfedu.txt
sed '/jfedu/,$d' jfedu.txt
(5) 删除 jfedu.txt 最后 6 行及删除最后一行:
for i in `seq 1 6`;do sed -i '$d' jfedu.txt ;done
sed '$d' jfedu.txt
(6) 删除 jfedu.txt 最后一行:
sed '$d' jfedu.txt
(7) 在 jfedu.txt 查找 jfedu 所在行,并在其下一行添加 word 字符,a 表示在其下一行添加字符串:
sed '/jfedu/aword' jfedu.txt
(8) 在 jfedu.txt 查找 jfedu 所在行,并在其上一行添加 word 字符,i 表示在其上一行添加字符串:
sed '/jfedu/iword' jfedu.tx
(9) 在 jfedu.txt 查找以 test 结尾的行尾添加字符串 word,$表示结尾标识,&在Sed 中表示添加:
sed 's/test$/&word/g' jfedu.txt
(10) 在 jfedu.txt 查找 www 的行,在其行首添加字符串 word,^表示起始标识,&在Sed 中表示添加:
sed '/www/s/^/&word/' jfedu.txt
(11) 多个 sed 命令组合,使用-e 参数:
sed -e '/www.jd.com/s/^/&1./' -e 's/www.jd.com$/&./g' jfedu.txt
(12) 多个 sed 命令组合,使用分号“;”分割:
sed -e '/www.jd.com/s/^/&1./;s/www.jd.com$/&./g' jfedu.txt
(13) Sed 读取系统变量,变量替换:
WEBSITE=WWW.JFEDU.NET
Sed “s/www.jd.com/$WEBSITE/g” jfedu.txt
(14) 修改 Selinux 策略 enforcing 为 disabled,查找/SELINUX/行,然后将其行enforcing 值改成 disabled、!s 表示不包括 SELINUX 行:
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config
通常而言,SED 将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执行完毕,然后该行被输出,模式空间请空;然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完备。
如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得 sed 在处理文件的时候不按照正常的流程来进行。这时可以使用 SED 高级语法来满足用户需求。总的来说,
SED 高级命令可以分为三种功能:
❑ N、D、P:处理多行模式空间的问题;
❑ H、h、G、g、x:将模式空间的内容放入存储空间以便接下来的编辑;
❑ :、b、t:在脚本中实现分支与条件结构。
(1) 在 jfedu.txt 每行后加入空行,也即每行占永两行空间,每一行后边插入一行
空行、两行空行及前三行每行后插入空行:
sed '/^$/d;G' jfedu.txt
sed '/^$/d;G;G' jfedu.txt
sed '/^$/d;1,3G;' jfedu.txt
(2) 将 jfedu.txt 偶数行删除及隔两行删除一行:
sed 'n;d' jfedu.txt
sed 'n;n;d' jfedu.txt
(3) 在 jfedu.txt 匹配行前一行、后一行插入空行以及同时在匹配前后插入空行:
sed '/jfedu/{x;p;x;}' jfedu.txt
sed '/jfedu/G' jfedu.txt
sed '/jfedu/{x;p;x;G;}' jfedu.txt
(4) 在 jfedu.txt 每行后加入空行,也即每行占永两行空间,每一行后边插入空行:
sed '/^$/d;G' jfedu.txt
(5) 在 jfedu.txt 每行后加入空行,也即每行占永两行空间,每一行后边插入空行:
sed '/^$/d;G' jfedu.txt
(6) 在 jfedu.txt 每行前加入顺序数字序号、加上制表符\t 及.符号:
sed = jfedu.txt| sed 'N;s/\n/ /'
sed = jfedu.txt| sed 'N;s/\n/\t/'
sed = jfedu.txt| sed 'N;s/\n/\./'
(7) 删除 jfedu.txt 行前和行尾的任意空格:
sed 's/^[ \t]*//;s/[ \t]*$//' jfedu.txt
(8) 打印 jfedu.txt 关键词 old 与 new 之间的内容:
sed -n '/old/,/new/'p jfedu.txt
(9) 打印及删除 jfedu.txt 最后两行:
sed '$!N;$!D' jfedu.txt
sed 'N;$!P;$!D;$d' jfedu.txt
(10) 合并上下两行,也即两行合并:
sed '$!N;s/\n/ /' jfedu.txt
sed 'N;s/\n/ /' jfedu.txt