(十九) Sed编辑器

本文详细介绍了Linux中的Sed编辑器,包括其基础操作和高级功能。Sed是一种流编辑器,通过预定义的规则处理数据流。内容涵盖命令行定义编辑器命令、从文本文件读取命令、替换命令(s)、地址、删除行(d)、插入和追加文本、修改行、转换命令(y)、打印命令以及如何处理文件。Sed编辑器的命令包括在行内替换、按行地址或文本模式过滤、删除行、在特定位置插入和追加文本、修改行内容以及转换单个字符等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sed编辑器

前面我们介绍了普通的交互式编辑器(Vim),可以通过键盘命令来交互式插入、删除、或替换文本中的数据,这儿会在解说Linux中两个广泛使用的命令行编辑器:sed和gawk;能够轻松实现自动化格式化、插入、修改、删除文本等;

1. Sed编辑器基础

又称为流编辑器(Stream editor),通过处理数据前基于事先提供的一组规则来编辑数据流;

sed编辑器可以通过命令来处理数据,这些命令来自:

  1. 命令行输入
  2. 命令文本文件

编辑器执行的流程:

  1. 一次读取一行数据
  2. 根据提供的编辑器命令匹配数据
  3. 按照命令修改流中的数据
  4. 将新的数据输出到STDOUT

有多少行数据,就重复这个流程多少次;

sed命令格式:

	sed options script file

57

script指定了用于数据流的单个命令,如果需要多个命令要么使用-e选项在命令行中指定,要么使用-f选项在单独的文件中指定;

1. 在命令行定义编辑器命令

  1. 默认情况下,编辑器会将指定的命令应用到STDIN输入流上,可以直接将数据通过管道符(|)输入编辑器处理;如:

     	echo “this are leslie” | sed '/s/are/is/'
    


这儿只是修改了一行,如果要修改多行,我们可以指定文本文件;这里的s命令是编辑器替换文本命令,后面会讲解,用第二个文本替换前一个文本;

***在命令行使用多个编辑器命令:***使用-e选项;命令之间必须用分号隔开,并且命令末尾和分号之间不能有空格;除此之外还有一种方式使用次提示符(>):输入第一个单引号(’)表示sed程序脚本的起始,在命令结束所在行有单引号标识结束

2. 从文本中读取编辑器命令

使用-f选项来指定编辑器命令文本,为了避免sed编辑器命令脚本文件bash shell脚本文件搞混,我们可以使用.sed作为其扩展名

1.1.1 替换命令-s

语法格式:

	s/被替换文本/替换文本/
1.1.1.1 替换标记

上面我们说了替换命令s使用,假入在一行中要全部替换出现的那个文本,而s命令只会替换出现的第一处;如:

	echo “this is leslie,leslie” | sed 's/leslie/lin/'

这儿就是会替换这一行第一个"leslie"文本,如果要替换多处,需要在替换字符串后添加替换标记:

	echo “this is leslie,leslie” | sed 's/leslie/lin/替换标记'

替换标记有四种:

  1. 数字:将第几处匹配的文本替换为指定的新文本
  2. g:替换所有匹配的文本地方
  3. p:打印匹配行对应原先的行内容,通常与-n选项:(禁止编辑器输出)一起使用;
  4. w file :将替换的结果写入文件(只会将匹配的行,修改后写入文件)

如果我们替换的文本中路径名,这时可能就会有问题,替换命令中我们(/)作为字符串分隔符,这时我们就必须对路径名中(/)进行转义:

sed 's/\/bin\/bash\/bin\/csh/' /etc/passwd

也可以选择其他字符来作为字符串分隔符,比如这里我们使用感叹号作为分隔符

sed 's!/bin/bash!/bin/csh!' /etc/passwd

1.1.2 地址

地址的作用就是将命令作用吧与指定行;

默认情况下,sed编辑器命令作用于文本数据的所有行;

行地址放在编辑器命令前;

如:

	sed '3s/lin/leslie/' test

如果是将行地址对应的进行多个命令

	sed 地址{命令1
			命令2...}

有两种表示寻址行的方式:

1. 数字形式表示区间

如果是单行,直接指定对应行数既可,如果是一个区间:起始行,结束行

行:可以使单行(N)、行区间(起始行,结束行)、起始行到文本结束(其实行,$)

前者使用:

单行:sed ‘3/s/被替换/替换’ 文件

行区间: sed ‘1,3/s…’…

起始行到文尾: sed ‘2,$/s/…’

后者使用:

sed '2,${

	s/被替换/替换
	s/被替换/替换
	.....

}' 文件
2. 文本模式过滤行

格式:

	/文本模式/命令

除了使用固定文本过滤,sed编辑器在文本模式中还可以采用 正则表达式(下一篇将会讲到)来实现更好的匹配模式效果;

1.1.3 删除行命令-d

会删除指定寻址模式的所有行,如果为加寻址模式,表示删除所有的行;文本文件行数太多,我们不可能去一行一行的数,用“$”表最后一行;

	sed 'd' test

这儿没有指定行地址,会删除所有行,如果要删除特定行:

	sed	'2,$d' test

这儿会删除第二行到行末;

或者可可以他通过文本匹配删除行:

	sed '/this/d' test

1.1.4 插入(insert)、追加(append)文本

在指定行前插入新的一行或者在指定行后追加新的一行;

插入命令:i

追加命令:a

格式:

		[]:表示可以可有可无,这儿如果不指定行地址,表示对所有行执行命令

		sed '[行地址]命令\

		追加或者插入的新行' [文本文件件]

这个命令不能在单个命令行使用;

***注意:***插入行或者追加行,不能使用行地址区间;

前面我们说了,多行文本最后一行行地址用“$”表示;如:在文本末尾追加一行:

56

1.1.5 修改行

c命令格式:

	sed '行地址c\
	修改行文本' 文本文件

1.1.6 转换命令(y)

转换(transform)命令(y)是唯一一个可以处理单个字符的sed编辑器命令;

格式:

			sed 地址y/inchars/outchars/

转换命令会对inchars和outchars值进行一对一映射;第一个字符会被转换为outchars的第一个字符,第二个字符会被转换为outchars的第二个字符,以此类推…如果两者长度不一样,就会产生一条错误消息;

1.1.7 sed编辑器的三个打印命令

  1. p命令打印文本行
  2. 等号(=)打印行号
  3. l命令列出行

1.1.8 sed处理文件

1.1.8.1 写入文件命令(w)

用来向文件中写入行

格式:

		[地址]w 写入的文件的路径

关于路径可以是绝对路径也可以是相对路径,运行编辑器的用户都必须有该文件的写权限;

1.1.8.2 读入文件命令®

将文件中的数据读入指定位置对应的数据流;

2. Sed编辑器高级部分

打印行号
3. l命令列出行

1.1.8 sed处理文件

1.1.8.1 写入文件命令(w)

用来向文件中写入行

格式:

		[地址]w 写入的文件的路径

关于路径可以是绝对路径也可以是相对路径,运行编辑器的用户都必须有该文件的写权限;

1.1.8.2 读入文件命令®

将文件中的数据读入指定位置对应的数据流;

2. Sed编辑器高级部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值