Shell脚本文本三剑客之sed

1 sed 编辑器

sed 是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed 编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

2 sed 的工作流程

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

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

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

sed默认情况下对文件内容的操作不会直接影响文件内容,除非重定向输出或者sed -i

3 命令格式和常用选项、操作

sed -e '操作' 文件1 文件2...
sed -n -e '操作' 文件1 文件2..
sed -f 脚本文件 文件1 文件2...
sed -i -e '操作' 文件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)
  • d:删除
    在这里插入图片描述
  • -e:指定命令来处理输入的文本文件;-n:禁止sed编辑器输出
    只有一个命令的时候可以把-e省略
    在这里插入图片描述
  • =:打印行号;l:打印数据流中的文本和不可打印的ASCII字符
    在这里插入图片描述

3.1 sed 执行多条命令的方法

sed 从第一行开始按行去读取执行显示

sed -n -e '命令1' -e '命令2' 文件
sed -n -e '命令1;命令2'
sed -n'
命令1
命令2
....
'文件

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

3.2 sed 编辑器有2种寻址方式

sed 对指定行操作
1.以数字形式表示行区间

案例一
在这里插入图片描述
在这里插入图片描述
案例二:打印奇偶行
方法一
在这里插入图片描述
方法二 n表示移动到下一行
在这里插入图片描述
案例三
在这里插入图片描述
2.用字符串或者用文本模式来过滤出行

案例一
在这里插入图片描述
案例二
在这里插入图片描述
案例三
删除空行的方法

方法一:grep -v "^$" test1
方法二:cat test1 | tr -s "\n"
方法三:sed '/^$/d' test1

案例四
在这里插入图片描述
sed会读取每行的内容,从第一个位置打开删除功能,到第二位置删完后关闭删除功能
在这里插入图片描述

4 sed 替换

格式:行范围 s/旧字符串/新字符串/替换标记

4种替换标记

数字:表明新字符串将替换第几处匹配的地方
g:表明新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w文件:将替换的结果写到文件中

案例一
方法一:vim编辑器
在这里插入图片描述
方法二:sed
在这里插入图片描述
案例二:把etc/passwd里1-10行注释掉
在这里插入图片描述
案例三
在这里插入图片描述
案例四

sed 's9\945\9\99\98\939p'
s后面跟的命令是分隔符,即9是分隔符
想要把9改为普通字符要加上\
94599 9893

案例五
在这里插入图片描述
案例六
方法一
在这里插入图片描述
方法二
在这里插入图片描述

4.1 sed 的字符串位置的交换

在这里插入图片描述

5 sed 增删改查

sed -i 可以直接修改文件内容,操作前建议先验证命令和备份目标文件

删d   
改  s(字符串替换) c(整行替换) y(对应字符进行替换,效果类似tr命令)
查p  a插入,i行前插入
增   a(在行后添加内容)  i(在行前插入内容)  r(在行后文件的内容)

案例一
在这里插入图片描述
案例二
在这里插入图片描述
案例三
在这里插入图片描述
案例四
在这里插入图片描述

6 sed 复制 粘贴、剪切 粘贴

vim vi编辑器复制 粘贴、剪切 粘贴

命令模式
dd  p 剪切 粘贴
yy  p 复制 粘贴

末行模式
:1,3 co 15  复制 粘贴
:1,3 m 15   剪切 粘贴

sed 复制 粘贴、剪切 粘贴

复制 粘贴:H(复制到剪切板)  G(粘贴到指定行后)
sed '1,3H;$G 脚本名'       复制 粘贴

剪切 粘贴:
sed '1,3 {H;d};$G' 脚本名   剪切 粘贴
sed '1,3 {H;d};10G' 脚本名   剪切 粘贴
$G:最后一行
G:粘贴到哪一行

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

7 总结

#sed 替换
s/OLD/NEW/2   //代表对每行第二个匹配到的字符进行替换
          g   //代表对每行所有能匹配到的字符进行替换
          p   //可以结合 -n 选项只打印替换的行内容
          w   //可以把替换的行内容保存到指定的文件里

行区间替换               
n,m s/OLD/NEW/
/字符串+正则/   s/OLD/NEW/
s/OLD+正则/#&    //&代表旧字符中使用正则表达式匹配到的内容

s/^/添加的字符/      //这是在行首添加内容
s/$/添加的字符/      //这是在行尾添加内容

sed -f 文件     //可以在文件里定义多条操作规则

sed 替换命令的字符串分隔符
就看s后面跟的字符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符则需要使用 \ 来转义

#增删改查
sed -i 可以直接修改文件内容,操作前建议先验证命令和备份目标文件

删d   
改  s(字符串替换) c(整行替换) y(对应字符进行替换,效果类似tr命令)
查p  a插入,i行前插入
增 a(在行后添加内容)  i(在行前插入内容)  r(在行后文件的内容)

#复制粘贴、剪切粘贴
复制 粘贴:H(复制到剪切板)  G(粘贴到指定行后)
sed '1,3H;$G 脚本名'       复制 粘贴

剪切 粘贴:
sed '1,3 {H;d};$G' 脚本名   剪切 粘贴
sed '1,3 {H;d};10G' 脚本名   剪切 粘贴
$G:最后一行
G:粘贴到哪一行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值