文本处理三剑客之 Sed ——一般编辑命令

sed简介

sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk.

sed又称行编辑器,每次读取并处理一行文本.

工作原理

1.sed命令开始执行后

2.先从文本中读取第一行,放在模式空间 (pattern space)中

3.判断这行文本是否符合指定模式,符合则进行编辑,然后把结果输出到标准输出.

4.不符合的话默认也会输出到标准输出.除非特别指定不输出不符合的结果行.

5.继续读取下一行,以此类推.

  • sed默认会对文件的每一行做处理.
  • 可以指定sed仅处理匹配到的行
  • 默认不对原文件进行编辑,只输出处理结果
  • 在sed的高级用法中会用到sed的另一个空间:保持空间(hold space).
  • 模式空间读进来的数据可以放进保持空间等待后续操作,两个空间的数据可以自由移动,互相覆盖或追加.

sed原理简图

命令格式

sed [option]... ‘script‘ inputfile..

script:

sed处理文本所应用的脚本,如地址定界,编辑操作

sed的选项(options)

-n:不自动输出模式空间的内容到屏幕

-e script, --expression=script:实现多点编辑,

如:

 # sed -e ‘[email protected]^#[[:space:]]*@@‘ -e ‘/^UUID/d‘ /etc/fstab

-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r , --regexp-extended: 支持使用扩展正则表达式

-i[SUFFIX], --in-place[=SUFFIX]:对原文件进行编辑

-i.bak: 编辑原文件前会先创建一个 原文件名+.bak后缀的备份

地址定界:

(1) 不给地址:对全文进行处理

(2) 单地址:

#: 指定的行

/pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围

#,#:从第#行开始到第#行结束

#,+#:从第#行开始,加#行

#,/pat1/:从第#行开始,到第一次被模式匹配的行结束

/pat1/,/pat2/:从被模式1匹配到的第一行开始,到被模式2匹配到的第一行结束;

$:最后一行

(4)步进:~

1~2:表示从1开始,步进2行,如3,5,7行即所有奇数行

2~2:表示所有偶数行

示例:

文件text内容如下:

$ cat text
1a
2b
3c
4d
5e
6f
7g
8h
9i

$ sed -n ‘2p‘ /etc/issue #显示第二行
2b

$ sed -n ‘/e$/p‘ text #显示e结尾的行
5e

$ sed -n ‘4,8p‘ text #显示第4到第8行
4d
5e
6f
7g
8h

$ sed -n ‘4,+3p‘ text #显示第4行以及后面的3行
4d
5e
6f
7g

$ sed -n ‘/c$/,/^7/p‘ text #显示c结尾的行开始到7开头的行中的所有行
3c
4d
5e
6f
7g

$ sed -n ‘5,/^7/p‘ text #显示第五行开始到7开头的行中的所有行
5e
6f
7g

$ sed -n ‘2~3p‘ text #从第2行开始,每隔3行显示一行
2b
5e
8h

$ sed -n ‘1~2p‘ text #显示奇数行
1a
3c
5e
7g
9i

常用一般编辑命令

d: 删除模式空间匹配的行,并立即进入下一轮循环

p:打印当前模式空间内容,追加到默认输出之后

a [\]text:在指定行后面追加文本,支持使用\n实现多行追加

i [\]text:在行前面插入文本

c [\]text:把匹配到的行替换为单行或多行文本

w /path/somefile: 保存模式匹配的行至指定文件

r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后

=: 为模式空间中的行打印行号

!:模式空间中匹配行取反处理

示例:

	$ cat /etc/passwd -n | sed ‘2,51d‘ #删除2-51行
	     1	root:x:0:0:root:/root:/bin/bash
	    52	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
	    53	named:x:25:25:Named:/var/named:/sbin/nologin

	$ sed ‘2~2d‘ text #删除偶数行,显示奇数行
	1a
	3c
	5e
	7g
	9i

	$ df | sed -n ‘/^\/dev\/sd/p‘ #过滤出dev/sd开头的行
	/dev/sda2       52403200 3932216  48470984   8% /
	/dev/sda5       20961280  142872  20818408   1% /app
	/dev/sda1        1038336  161556    876780  16% /boot

	$ sed ‘2,4a\   = = =‘ text #在2-4行后面分别追加自定义字符,斜线\表示之后出现的所有字符都算内容.
	1a
	2b
	   = = =
	3c
	   = = =
	4d
	   = = =
	5e
	6f
	7g
	8h
	9i

	$ sed ‘4i\ = = =‘ text #在第4行上方加入字符
	1a
	2b
	3c
	 = = =
	4d
	5e
	6f
	7g
	8h
	9i

	$ sed ‘/^6/c\6666‘ text #把第6行替换为6666
	1a
	2b
	3c
	4d
	5e
	6666
	7g
	8h
	9i

	$ sed -n ‘/^alias/w /app/alias.txt‘ ~/.bashrc #把.bashrc文件中的alias开头的行保存到/app/alias.txt中
	$ cat alias.txt
	alias rm=‘rm -i‘
	alias cp=‘cp -i‘
	alias mv=‘mv -i‘

	$ sed ‘/^alias/r /etc/centos-release‘ ~/.bashrc #把/etc/centos-release中的内容插入到.bashrc中被模式匹配到的行之后
	# .bashrc

	# User specific aliases and functions

	alias rm=‘rm -i‘
	CentOS Linux release 7.4.1708 (Core)
	alias cp=‘cp -i‘
	CentOS Linux release 7.4.1708 (Core)
	alias mv=‘mv -i‘
	CentOS Linux release 7.4.1708 (Core) 

	# Source global definitions
	if [ -f /etc/bashrc ]; then
		. /etc/bashrc
	fi

	$ sed ‘/^alias/=‘ ~/.bashrc #在匹配到的行只上添加行号
	# .bashrc

	# User specific aliases and functions

	5
	alias rm=‘rm -i‘
	6
	alias cp=‘cp -i‘
	7
	alias mv=‘mv -i‘

	# Source global definitions
	if [ -f /etc/bashrc ]; then
		. /etc/bashrc
	fi

	$ sed -n ‘/^alias/!p‘ ~/.bashrc #显示没有被匹配到的行(结果取反)
	# .bashrc

	# User specific aliases and functions

	# Source global definitions
	if [ -f /etc/bashrc ]; then
		. /etc/bashrc
	fi

	$ sed -n ‘/e$/!p‘ text #显示除了e结尾的行的所有行
	1a
	2b
	3c
	4d
	6f
	7g
	8h
	9i

查找替换:

s///,支持使用其它分隔符,如 [email protected]@@,s### ,s___

替换标记:

g: 行内全局替换

p: 显示替换成功的行

w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

示例:

	$ sed -rn ‘[email protected]^[0-9][email protected]@p‘ text  #删除所有数字开头行的数字
	a
	b
	c
	d
	e
	f
	g
	h
	i

	$ sed  ‘[email protected]*@#&@‘ text #给text文件中每一行前面加#号
	#1a
	#2b
	#3c
	#4d
	#5e
	#6f
	#7g
	#8h
	#9i

	# 删除文件中以#号开头后跟一个空白字符的行的开头的#和空白字符
	$ cat text2
	this is 1
	# this is 2
	#this is 3
	# this is 4
	this is 5

	$ sed ‘[email protected]^#[[:space:]]@@‘ text2
	this is 1
	this is 2
	#this is 3
	this is 4
	this is 5

	# 给text2文件中不以#开头的行的行首加#号
	$ cat text2
	this is 1
	# this is 2
	#this is 3
	# this is 4
	this is 5

	$ sed  ‘[email protected]^[^#].*@#&@‘ text2
	#this is 1
	# this is 2
	#this is 3
	# this is 4
	#this is 5

	$ echo /app/testdir/rootdir/motd/ | sed -r ‘[email protected](^/.*/)(.+)/[email protected]\[email protected]‘ #取目录名
	/app/testdir/rootdir/
	$ echo /app/testdir/rootdir/motd/ | sed -r ‘[email protected](^/.*/)(.+)/[email protected]\[email protected]‘ #取基名
	motd/

	$ ifconfig ens33| sed -rn ‘[email protected]*inet (.*) netmask.*@\[email protected]‘ # 取出 ifconfig ens33命令中的ipv4地址
	192.168.5.137
时间: 2024-08-03 16:49:57

文本处理三剑客之 Sed ——一般编辑命令的相关文章

文本处理三剑客之 Sed ——高级编辑命令

本篇介绍sed的高级编辑命令 高级编辑命令 P:打印模式空间开端至\n内容,并追加到默认输出之前 n: 读取匹配到的行的下一行覆盖至模式空间 N:读取匹配到的行的下一行追加至模式空间 h: 把模式空间中的内容覆盖至保持空间中 H:把模式空间中的内容追加至保持空间中 g: 从保持空间取出数据覆盖至模式空间 G:从保持空间取出内容追加至模式空间 x: 把模式空间中的内容与保持空间中的内容进行互换 d: 删除模式空间中的行,并进入下一个循环 D: 删除当前模式空间开端至\n的内容,放弃之后的命令,之后

文本处理三剑客之sed

文本处理三剑客之sed sed概述 sed使用示例 sed的高级应用 sed概述 sed, 作为文本三剑客之一,其定位就是一个编辑器, 而且sed是一个流式编辑器(stream editor),其主要功能是过滤和转换文本. sed - stream editor for filtering and transforming text 作为一个强大的文本处理功能,sed 自然能够配合正则表达式,另外,所谓流编辑器,sed 是逐行地读取文本,在文本行中应用指定的命令,且默认输出到stdout; se

文本处理三剑客之sed(流编辑器)

文本处理三剑客之sed(流编辑器) - 行编辑器 把当前处理的行存储在临时缓冲区,称为模式空间,然后把模式空间的内容送往屏幕,一行一行的处理,主要用来编辑一个或者多个文件. - 用法 sed [option]... 'script' inputfile... ###### - 常用选项 -n:不输出模式空间内容到屏幕,即不自动打印 默认会打印模式空间的内容加-n 可以只显示需要打印的行 [root@localhost home]# sed -n '2,3p' /etc/passwd bin:x:

8.9_Linux文本处理三剑客之sed和文本编辑利器vim的使用

本文处理三剑客之sed的使用   什么是sed? Stream EDitor(简称sed), 行编辑器,一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上. sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多

Linux文本处理“三剑客”之sed

sed(Stream Editor)是一个行编辑工具.下面我们介绍 sed 的实现原理和基本使用方法. 一.sed 的处理文本的流程 基本处理流程如下: 处理流程是:每次读入文本文件的一行到内存中的模式空间中,在模式空间中处理后将处理的结果输出,默认会打印到屏幕上.因此,默认情况下,不会改变原文件的内容. 二.sed 命令的使用 基本语法:sed [options]... '地址定位 编辑命令' FILE... 地址定位的方法: 1.行定位: start_line[,end_line] 2.模式

文本工具三剑客:sed

文本工具三剑客:sedsde是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓存区,称为 模式空间    用法:    sed [选项] [加自己的语言] [要处理的文件]    选项:        -n  不输出模式中的内容至屏幕            # sed -n "10p" f2 只打印出第10行匹配到的行 其他不显示            10  UUID=07a475f4-3d7a-4b27-9ec9-500bc8a19c4d /boot      

Linux 篇 | 文本处理三剑客之SED

文本处理三剑客之SED sed不仅可以像grep过滤文件,查找想要的内容,还可以更改文件,这是grep做不到的. 一.sed介绍 Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.然后读入下行,执行下一个循环.如果没有使诸如'D'的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间.这

文本处理三剑客之sed的使用

1.sed命令的概述 (1)sed命令概述:一种交互式的文本编辑器(行编辑器) (2)工作原理:sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾. 文件内容并没有改变,除非你使用重定向存储输出. (3)用途:自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等 2.sed命令的使用:

文本处理三剑客之sed基本用法

sed:streameditor,意为流编辑器,是类Unix操作系统常见的命令行程序.sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出:sed通常用来匹配一个或多个正则表达式的文本进行处理. sed工作原理: sed维护了两个数据的缓冲空间:模式空间(patternspace)和保留空间(hold space),初始环境都为空: 1.当sed命令对一个文本文件进行处理,逐行读取文本文件进行地址匹配,将匹配到的行放在模式空间中: 2.sed的编辑命令对模式空间中的内容进行编