shell学习笔记---sed命令

sed命令
将一系列的编辑命令作用于一批文本。
格式1:sed 参数 sed命令 文件
格式2:sed 参数 -f sed脚本 文件 (sed脚本由多个sed命令组成)
格式3:./sed脚本 文件 (该写法的sed脚本与格式2中的sed脚本区别是第一行需要用#!/bin/sed 来声明运行所使用的解释器)
执行过程:从文件或准备输入中读取一次读取一行数据,复制到缓冲区,然后按照命令并对缓冲区文件进行处理。重复此过程直到文本所有行结束。所以操作的是缓冲区的副本,并输出到屏幕中,不会影响源文件。

参数含义
-n取消默认输出。不加该选项则会将缓冲区的每行内容输出到屏幕中
-e执行多个sed命令
-f从sed脚本中读取编辑命令
-i直接修改源文件,如若在mac执行可能需要备份源文件。-i “备份文件名” “操作文件名”(不想备份可使用"")

sed命令是由定位参数和编辑命令组成,格式是"定位参数 编辑命令",接下来分别学习定位参数以及编辑命令。
test1.txt内容如下:
在这里插入图片描述
定位参数方式1—行号:表示某一行(最后一行可以用$表示)

sed "2 p" test1.txt

结果:上面的命令定位参数是2,表示第二行;编辑命令是p,表示将缓冲区内容强制输出到屏幕中。合起来就是将第二行强制输出到屏幕,又因为该sed命令未使用-n参数,默认是输出缓冲区内容,所以第二行被输出了两次
在这里插入图片描述
定位参数方式2—行号1,行号2:表示从行号1到行号2之间的所有行

sed -n "3,5 p" test1.txt

结果:上面的命令定位参数是3,5,表示第三行到第五行;编辑命令是p,表示将缓冲区内容强制输出到屏幕中。合起来就是将第三行到第五行强制输出到屏幕,因为该sed命令使用了-n参数,不会默认输出缓冲区内容,所以只输出了第三行到第五行内容。
在这里插入图片描述
定位参数方式3—行号1~步长:表示从行号1开始,固定间隔距离为步长的行

sed -n "1~2 p" test1.txt

上面命令是输出文件中的所有奇数行
定位参数方式4—行号1,+行数:表示从行号1开始,以及后面在指定行数范围内的行

sed -n "2,+2 p" test1.txt

上面命令是输出第二行以及后面两行(第三行和第四行)的内容
定位参数方式5—/正则表达式/:通过正则表达式定位出符合的行(两个斜线之间是正则表达式)

sed -n "/^[0-9].*/ p" test1.txt

结果:上面命令是强制输出所有以数字为开头的行,双斜线之间的^[0-9].*为正则表达式内容
在这里插入图片描述
定位参数方式6—行号和正则表达式混用

sed -n "1,/^5.*/ p" test1.txt

结果:上面命令定位参数是1,/^5.*/ 表示从第一行开始到符合正则表达式内容(以5开头)的行之间的所有行
在这里插入图片描述
编辑命令p—通过命令p可以强制输出缓冲区内容。前文例子中均用到此参数,不多赘述。
编辑命令s—通过命令s可以替换文本内容。其格式为s/匹配内容/目的内容/参数。其中匹配内容一般为正则表达式。并不是一定要用斜线进行分隔,可以是其他任意字符,s命令紧跟着的字符被认定为分隔符。如果不指定目的内容则会替换成空字符串。

参数含义
g替换文本行中所有符合正则表达式的字符串,默认是替换第一个
n替换文本行中第n个符合正则表达式的字符串
p替换第一个符合正则表达式的字符串,并将缓冲区输出到屏幕
w替换第一个符合正则表达式的字符串,并将受影响的行输出到磁盘文件中
sed "1,3 s/e/E/g" test1.txt

结果:上面的命令是将test1文件中的第一行到第三行中,所有小写的e替换成大写E
在这里插入图片描述

sed "1,/.*five/ s/[0-9]//" test1.txt

结果:将第一行到含有five字符串的行中的第一个数字替换成空字符串。
在这里插入图片描述
如果目的内容中包含有&,则代表所匹配到的内容

sed "s/three/666 &/" test1.txt

结果:将文件中的three替换成"666 three",&就代表匹配内容即three。另外没有设置位置参数,就意味着范围是全文件
在这里插入图片描述
如果目的内容中包含有\n,则代表在匹配内容中第n个由圆括号括起来的子字符串,注意匹配内容中的圆括号前要加\

sed "s/\([0-9]\)\(:\)/\2\1/" test1.txt

结果:将没个行中的第一个数字和冒号调换文字,目的内容中的\1代表匹配内容中的数字,\2代表匹配内容中的冒号。
在这里插入图片描述
编辑命令d—通过此命令删除位置参数所指定的文本

sed "3,7 d" test1.txt

结果:删除第3行到第7行的文本。因为未指定-n参数所以会打印出缓存区内容,第一行和第二行未在范围内所以会正常输出,第三行到第七行则被删除不会输出
在这里插入图片描述
下面的命令是删除空白行,^$代表空行

sed "/^$/ d" test1.txt

编辑命令a—通过此命令在指定位置下面追加文本。格式:位置参数 a 追加内容
linux系统:

sed "6 a 7777" test1.txt

mac系统:注意a后面要有一个\,然后换行输入追加内容以及\,最后换行输入文件。注意是单引号

sed '6  a\ 
77777\
' test1.txt

结果:在第六行下面追加一行内容7777
在这里插入图片描述
编辑命令i—通过此命令在指定文本上面插入一行。格式:位置参数 i 插入内容
linux系统:

sed "7 i 7777" test1.txt

mac系统:注意i后面要有一个\,然后换行输入插入内容以及\,最后换行输入文件。注意是单引号

sed '7 i\
777\
' test1.txt 

结果:在第七行上面插入一行内容7777
在这里插入图片描述
编辑命令c—通过此命令将指定行的所有内容均替换成目的内容。格式:位置参数 c 目的内容
linux系统:

sed "7 c 777" test1.txt

mac系统:注意c后面要有一个\,然后换行输入目的内容以及\,最后换行输入文件。注意是单引号

sed '7 c\
777\
' test1.txt

结果:将第七行替换成777。位置参数也可以写成6,7,意思是将第六行到第七行替换成777
在这里插入图片描述
执行多个sed命令-----方式一:通过使用多个-e参数指定多个sed命令;方式二:在一个命令中通过分号将各个sed命令中隔开;方式三:如果各个sed命令的位置参数均一致,可以共用一个位置参数,并利用大括号将各个命令括起来,注意各个命令要独立一行

sed -n -e "2,5 s/[0-9]/0/g" -e "2,5 p" test1.txt #方式一
sed -n "2,5 s/[0-9]/0/g ; 2,5 p" test1.txt #方式二
sed -n "2,5{ 
    s/[0-9]/0/g
    p
    }" test1.txt #方式三

结果:将第二行到第五行中的数字全都替换成0,并只打印第二行和第五行的缓冲区内容
在这里插入图片描述
sed脚本—方式1:将多个sed命令写入一个文件中,一行一个命令,若一行多个命令需要用分号隔开,通过-f 参数执行脚本;方式二:命令编写方式和第一种相同,不同点是需要在第一行指定执行的解释器,添加可执行权限后通过./脚本名字直接执行,类似于shell脚本
方式1(test1.sed):

2,5 p
2,5 s/[0-9]/0/g
6 a\
 777\

执行命令:

sed -f test1.sed test1.txt

方式2(test2.sed):这里指定的解释器是在/usr/bin/目录下,Ubuntu等其他linux系统可能是/bin/sed。如果没有可以通过find命令找一下。

#! /usr/bin/sed -f
2,5 p
2,5 s/[0-9]/0/g
6 a\
 777\

执行命令:

chmod +x test2.sed
./test2.sed test1.txt

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值