Linux命令——sed

sed(strem editor,流编辑器)是一个面向行处理的工具,以“行”为单位,处理后的结果会输出到标准输出(stdout)。

一、工作原理

  处理时,sed会把要处理的存储在缓冲区中,然后再用sed命令处理缓冲区中的内容,最后将缓冲区的内容送到屏幕显示,一次一行,不断重复。这个缓冲区被称为 “模式空间”(pattern space)。

二、sed命令格式:

sed [option] {sed-command} {file}

1、option

  • -e<script>或–expression=<script> ——以选项中指定的script来处理输入的文本文件
                     【用来设置多个command】
  • -f<script文件>或–file=<script文件> ——以选项中指定的script文件来处理输入的文本文件。
  • -h或–help ——显示帮助。
  • -n或–quiet或–silent ——仅显示script处理的那几行,不会完整的显示处理后的文件。
  • -V或–version ——显示版本信息。
  • -i ——直接修改读取的文件内容,而不是输出到终端。
-e 选项用来设置多条命令
Eg: sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
	# 打印mysed.txt文件的第1到第2行,然后再打印第4行

注意:多个 command 之间,是按照在命令中的 先后顺序 来执行的。

-f 选项用来指定一个文件(该文件内写sed的command部分)作为当前sed命令的command部分
Eg: sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
	# 打印mysed.txt文件的第1到第2行,然后再打印第4行

所以,并不会修改文件本身!

2、sed-command

可以分为两部分:1)范围设定;2)动作处理。

(1)、范围设定

采用两种不同的方式来表达:
1)指定行数:

Eg: “3, 5”表示第3到第5行,“5,$”表示第5行到最后一行。

2)模式匹配:

Eg: “/^[^dD]/”表示匹配行首不是以d或D开头的行。

(2)、动作处理

几个常用动作:

  • d——表示删除整行
  • p——打印该行
  • r——读取指定文件的内容
  • a——新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行),且自带换行
  • i——插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
  • c——替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
  • y——替换,逐字替换
  • s——替换,可以直接进行替换的工作哩!通常这个 s 的动作可以搭配正则表达式
       【Eg: “1,20 s/old/new/g”】
  • n——将下一行内容放到处理缓存中,从而让当前这一行躲避开了替换动作
      【Eg: sed ‘/200/{n;y/eijng/EIJNG/;}’ mysed.txt #实现了隔行修改的效果】
  • w——写入指定的文件
      【Eg: sed ‘/200[4-6]/w new.txt’ mysed.txt】
#注意:1、y和s动作的区别:
#	     y只是简单的逐字替换,没有很多花样;
#	     s支持&符号和预存储等特性,可以实现更灵活的替换效果
#	  2、y动作后重复的字符只会识别一个,且只替换识别到的重复字符的第一个对应的字符
	     Eg: sed 'y/ee/ie/' mysed.txt # 这里只会将所有的e匹配为i

举例:
1、在testfile文件的第四行 后 添加一行,并将结果输出到标准输出
	sed -e 4a\newLine testfile
2、在testfile文件的第四行 前 添加一行,并将结果输出到标准输出
	sed -e 4i\newLine testfile
3、显示 test文件 的第10行到第20行的内容
	sed -n '10,20p' test
4、将所有以 d 或 D 开头的行里的所有小写 x 字符变为大写 X 字符【*】
	sed '/^[dD]/s/x/X/g' test
5、删除每一行的前两个字符
	sed 's/..//' test
6、按照字符顺序实现前后的替换
	sed 'y/ei/ie/' mysed.txt

(3)、特殊符号

  a、&——表示的是“之前被匹配的部分”

Eg: sed 's/B.*/&2008/' mysed.txt
	# 匹配以B开头的字符串所在的行,将匹配到的字符串变为匹配到的字符串后接2008

  b、()——sed的预存储技术,用于将其存储到 \1、\2……

Eg: echo "hello world" | sed 's/\(hello\).*/world \1/'
	# 将hello存储到 \1,然后将其存在world字符串后!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值