6.文本三剑客--sed

文章目录

  • 文本三剑客
    • sed
      • 介绍
      • 命令介绍
      • 打印内容
      • 删除
      • 替换
      • 插入
      • 分组

文本三剑客

sed

介绍

sed编辑器

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来

编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要

么存储在一个命令文本文件中。

sed的工作流程主要包括读取、执行和显示三个过程:

  • 读取:sed从输入流 (文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
  • 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重 复执行,直至所有内容被处理完。

sed对数据的处理是对缓冲区的文件进行处理,一般不会对源文件进行修改

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

对于很大的文件,流编辑器处理会非常慢,通过IO一行一行处理

处理方法:1. 将文件通过cat显示,再通过管道符传送

2. 将大文件切分成小文件再处理

命令介绍

命令格式:

sed -e '操作' 文件1 文件2
sed -n -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2


sed -e 'n{          ##   n   指定行号
操作1
操作2

}' 文件1 文件2
常用选项:

-e 或 --expression=  :表示用指定命令来处理输入的文本文件,只有一个操作命令时					  可省略,一般在执行多个操作命令使用

-f 或 --file=  :表示用指定的脚本文件来处理输入的文本文件

-h 或  --help  :显示帮助

-n 、--quiet 或 silent  :禁止sed编辑器输出,
						 但可以与   p   命令一起使用完成输出

-i  :直接修改目标文本文件
常用操作:

s :替换,替换指定字符

d :删除,删除选定的行

a :增加,在当前行下面增加一行指定内容

i :插入,在选定行上面插入一行指定内容

c :替换,将选定行替换为指定内容

y :字符转换,转换前后的字符长度必须相同

p :打印,如果同时指定行,表示打印指定行;
	    如果不指定行,则表示打印所有内容;
        如果有非打印字符,则以ASCII码输出,其通常与  -n   选项一起使用
        
= :打印行号


l(小写L) :打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

打印内容

sed -n -e 'p' file     ##打印内容
cat file | sed -n 'p'   ##只有一个操作命令  -e  可省略

cat file | sed -n '='   ##打印行号
cat file | sed -n 'l'   ##打印内容包括换行符等

6.文本三剑客--sed_第1张图片
6.文本三剑客--sed_第2张图片
6.文本三剑客--sed_第3张图片

cat file | sed -n -e '=' -e 'p'   ##同时显示行号和内容
cat file | sed -n '=;p'    ##实现多个命令的同时执行
cat file | sed -n '= 回车 p'

在这里插入图片描述
6.文本三剑客--sed_第4张图片
6.文本三剑客--sed_第5张图片

cat file | sed -n '4p'    ##打印第四行
cat file | sed -n '$p'    ##打印最后一行
cat file | sed -n '1,3p'  ##打印1到3行
cat file | sed -n '4p;$p'  ##打印第四和最后一行
cat file | sed -n '1,+3p'  ##打印第一行以及之后的连续三行
cat file | sed '5q'        ##执行到第五行退出,就显示前五行

6.文本三剑客--sed_第6张图片

cat file | sed -n 'p;n'    ##显示奇数行    ;n 表示移动到下一行
##第一次执行在第一行,通过p打印,  添加  n  将sed处理的行到第二行,结束
##第二执行时,自动到第三行,通过p打印,再自动跳转到下一行,结束执行

cat file | sed -n 'n;p'   ##显示偶数行

cat file | sed -n '2,${n;p}'  ##从第二行到最后行,执行  n;p  操作

cat file | sed -n '3 {p;n;n;p}' ## 只在第三行处理

6.文本三剑客--sed_第7张图片

##通过字符串打印行内容
##  使用   //    中间添加字符串,能使用正则表达式

cat file | sed -n '/root/p'   ##将包含 root 字符串 的行打印出来
cat file | sed -n '/^root/p'  ##打印以root开头的行

cat file | sed -nr '/root|ftp/p'  ##同时打印两个
cat file | sed -n '/root\|ftp/p'

cat file | sed -n '2,/ftp/p'    ##从第二行开始,显示到第一个FTP的内容

扩展正则要添加  -r       不添加的话要使用   \

6.文本三剑客--sed_第8张图片

删除

cat file | sed '3d'     ##删除第三行
cat file | sed '3,5d'   ##删除3到5行
cat file | sed '$d'     ##删除最后一行

6.文本三剑客--sed_第9张图片

cat file | sed '/login$/d'  ##删除以什么什么结尾的行
cat file | sed '/bash$/!d'  ##删除不是以 bash  结尾的行
cat file | sed -r '/[^(bash)]$/d'

6.文本三剑客--sed_第10张图片

cat file | sed '/2/d'   ##删除包含2的行
cat file | sed -r '/2|3/d'   ##删除包括2或者3的行
cat file | sed -r '2,/3/d'   ##从第二行开始删除到含有第一个3的行

6.文本三剑客--sed_第11张图片

cat file | sed -r '/2/,/3/d'  ##从第一个包含2的行删到第一个包含3的行

cat file | sed  '/2/,/3/d'  ##在删除时,不会停止,在第一个结束后,还会在后                             面继续找匹配的行
##从第一个包含字符串1的行开始删到第一个包含字符串2的行,之后行会重复之前的规则操作

6.文本三剑客--sed_第12张图片

##删除空行的方法
grep -v "^$"
tr -s '\n'
sed '/^$/d'

6.文本三剑客--sed_第13张图片

替换

s/abc/123/2  ##替换第二个abc为123
s/abc/123/g  ##替换所有的abc
s/abc/123/p  ##替换并打印行

6.文本三剑客--sed_第14张图片

cat file | sed -n 's/root/admin/p'  ##替换root并打印替换的行
cat file | sed -n 's/root/admin/2p'
cat file | sed -n 's/root//gp'     ##删除root字符不删除行

6.文本三剑客--sed_第15张图片

cat file | sed -n 's/^#//p'
cat file | sed -i -n 's/^/#/p'  ##批量添加 #  并修改文件

6.文本三剑客--sed_第16张图片

cat file | sed '5,10 s/^#//'    ##5到10行删除#
cat file | sed 's/^#//;n'     ##删除奇数行的#

6.文本三剑客--sed_第17张图片

cat file | sed -n '/swap/ s/^/#/p'  ##将包含字符串的行替换
cat file | sed -n '/^UUID/ s/^/#/p'

cat file | sed 's/.*swap.*/#&/'   ##  & 表示前面正则所匹配到的行

6.文本三剑客--sed_第18张图片

cat file | sed '10,20 s/^/#/w 123.txt'   ##将修改的行保存到其他文件
cat file | sed -n '10,20 s/^/#/p' > 123.txt

6.文本三剑客--sed_第19张图片

cat file | sed -n 's/\/bin\/bash/\/sbin\/nologin'

cat file | sed -n 's#/bin/bash#/sbin/nologin#p' 
##可以将分隔符替换成其他符号,数字也行

cat file | sed -n 's9\945\9\99\98\939g'  ##将94599替换为9893

6.文本三剑客--sed_第20张图片

##把以root开头的行注释了
##将ftp都替换成mysed
##把以nologin为结尾的行删除

vim mysed
/^root/ s/^/#/
s/ftp/mysed/g
/nologin$/d

sed -f mysed /opt/file

插入

sed '10c hello world' file  ##替换指定行的整行内容

6.文本三剑客--sed_第21张图片

sed 'y/145/abc' file   ##将145转换为abc,对应关系

6.文本三剑客--sed_第22张图片

sed '1a 123' file   ##在第一行下面插入
sed '$a 123' file   ##在最后一行插入
sed '1,3a 123' file
sed '1,3i 123' file  ##在指定行上面

6.文本三剑客--sed_第23张图片

sed '1r 123.txt' file   ##在第一行后读取文件内容,实现文件合并

sed '/^#t/i 123' file   ##行号可以是字符串

6.文本三剑客--sed_第24张图片

sed '1,3H;$G' file   ##将1到3复制到最后
sed '/^$/d'

sed '1,3H;10,$G' file  ##将1到3行复制到10到最后,每行都粘贴
 
 ##剪切   保持空间
sed '1,3{H;d};$G' file

6.文本三剑客--sed_第25张图片

分组

sed -r 's/(111)(222)(333)/\3\2\1/'
\3  代表第三组
\2 代表第二组
sed -r 's/(^.)(.*)(.$)/\3\2\1/'          ##实现第一个和最后一个进行交换

6.文本三剑客--sed_第26张图片

你可能感兴趣的:(4.shell脚本,linux,服务器,windows)