sed命令
sed
是一个非交互性文本流编辑器,它编辑文件或标准输入导出的文本拷贝。标准输入可能来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。
无论命令是什么,sed
命令不与初始化文件打交道,它操作的只是一个拷贝,然后所有如果没有重定向到一个文件,将输出到屏幕。
1. sed怎么读取数据
sed
从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程知道命令结束。
2. 调用sed
sed
调用有三种方式:1. 在命令行键入命令;2. 将sed
命令插入脚本文件,然后调用sed
;3. 将sed
命令插入脚本文件,并使sed
脚本可执行。
使用sed
命令行格式:
$ sed [选项] sed命令 输入文件
命令行使用sed
命令时,实际命令要加单引号,sed
也允许加双引号。
使用sed
脚本文件,格式为:
$ sed [选项] -f sed脚本文件 输入文件
要使用第一行具有sed
命令解释器的sed
脚本文件,其格式为:
$ sed脚本文件 [选项] 输入文件
不管是用哪种方式,如果没有指定输入文件,sed
将从标准输入中接收输入,一般式键盘或重定向结果。
sed
选项如下:
-n
:sed
不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p
命令可以用来打印编辑行。-c
: 下一命令是编辑命令,使用多项编辑时加入此选项。如果只用到一条sed
命令,此选项无用,但指定它也没有关系。-f
: 如果正在调用sed
脚本文件,使用此选项。此选项通知sed
一个脚本文件支持所有sed
命令,如:sed -f myscript.sed inputFile
,这里myscript.sed
即为支持sed
命令的文件。
2.1. 保存sed输入
由于不接触初始化,如果想要保存改动内容,简单的将所有输出重定向到一个文件即可。下面的例子重定向sed
命令的所有输出至文件myoutfile
:
$ sed 'some-sed-commands' input-file > myoutfile
2.2 使用sed在文件中查询文本的方式
sed
浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
- 使用行号,可以是一个简单的数字,或是一个行号范围。
- 使用正则表达式
下表给出使用sed
定位文本的一些方式:
格式 | 含义 |
---|---|
x |
x 为一行号,如1 |
x,y |
表示行号范围,如2,5 表示从第2行到第5行 |
/pattern/ |
查询包含模式的行,例如/[a-z]/ |
/pattern/pattern/ |
查询包含两个模式的行,例如/disk/disks/ |
/pattern/,x |
在给定行号上查询包含模式的行,如/ribbon/,3 |
x,/pattern/ |
通过行号和模式查询匹配行,3,/vdu/ |
x,y! |
查询不包含指定行号x 和y 的行,如1,2! |
2.3 基本sed编辑命令
下表给出了sed
的编辑命令
命令 | 含义 |
---|---|
p |
打印匹配行 |
= |
显示文件行号 |
a\ |
在定位行号附加新文本信息 |
i\ |
在定位行号后插入新文本信息 |
d |
删除定位行 |
c\ |
用新文本替代定位文本 |
s |
使用替换模式替换相应模式 |
r |
从另一个文件中读文本 |
w |
写文本到一个文件 |
q |
第一个模式匹配完成后推出或立即推出 |
l |
显示与八进制ASCII码等价的控制字符 |
{} |
在定位行执行的命令组 |
n |
从另一个文件中读文本下一行,并附加在下一行 |
g |
将模式2粘贴到/pattern n/ |
y |
传送字符 |
n |
延续到下一输入行;允许跨行的模式匹配语句 |
3. sed和正则表达式
sed
可以识别任何基本正则表达式和模式及其行匹配规则。记住规则之一:如果要定位一特殊字符,必须使用\
转义。
4. 基本sed编程举例
4.1 使用p显示行
打印第二行:
$ sed -n '2p' input.txt
4.2 打印范围
打印第1行到第3行:
$ sed -n '1,3p' input.txt
4.3 打印模式
打印匹配模式pattern
的行:
$ sed -n '/pattern/'p ipt.txt #测试了一下p写在引号里也可以
4.4 使用模式和行号进行查询
如果要匹配某个单词,可能会返回很多行,使用行号和模式结合,进行精确匹配:
$ sed -n 'n,/pattern/'p input.txt
n,
表示匹配第n行符合模式的行。
4.5 匹配元字符
匹配元字符$
必须使用反斜线\
进行转义,模式为'/\$/'p
:
$ sed -n '/\$/'p input.txt
4.6 显示整个文件
只需将行范围设置为1,$
,$
意为最后一行:
$ sed -n '1,$p' input.txt
4.7 任意字符
.
匹配任意字符,*
表示0次或多次重复,并以ing
结尾:
$ sed -n '/.*ing/'p input.txt
4.8 打印行号
$ sed -e '=' input.txt #显示所有的行号和内容
$ sed -n '=' input.txt #显示所有的行号
$ sed -n '/pattern/=' input.txt #显示匹配行的行号
$ sed -n -e '/patter/p' -e '/pattern/=' input.tst #显示匹配行内容及行号
4.9 附加文本
使用a\
附加文本,可以将制定文本一行或多行附加到指定行。如果不指定文本放置位置,sed
缺省放在每一行后面。附加文本不能指定范围,只允许一个地址模式。
文本附加操作时,结果输出到标准输出上。它不能被编辑,因为sed
执行时,首先将文件的一行文本拷贝至缓冲区,在这里sed
编辑命令执行所有操作(不在初始文件上),文本直接输出到标准输出。
如果想在附加操作后编辑文件,必须保存文件,然后运行另一个sed
命令编辑它。
[address]a\
text\
text\
...
text
地址指定一个模式或行号,定位新文本附加位置。a\
通知sed
对a\
后的文本进行实际附加操作。每一行有一个斜线表示换行。最后一行不加斜线,sed
假定这是附加命令结尾。
4.10 创建sed脚本
创建脚本文件append.sed
,输入下列内容:
#!/bin/sed -f
/pattern/ a\
this is the content to be appended.
保存,添加执行权限:$ chmod u+x append.sed
,然后运行:$ ./append.sed input.txt
。
其将在/pattern/
匹配的行后面附加内容然后输出到标准输出,并不会改变源文件。
4.11 插入文本
指定一个匹配模式或行号,加i\
,然后附加内容,和上面类似。
#!/bin/sed -f
4 i\
this is the content to be inserted.
在第4行前插入文本。
4.12 修改文本
用新文本在匹配行替代,和上面类似,可以指定行号,也可以是模式。
#!/bin/sed -f
/pattern/ c\
this is the content
4.13 删除文本
$ sed '1d' input.txt #删除第一行
4.16 替换文本
$ sed [address[,address] s/pattern-to-match/replace-pattern/[g p w n]
s
选项通知sed
这是一个替换操作,并查询pattern-to-match
,成功后用replace-pattern
替换它。
替换选项如下:
g
:缺省情况下只替换第一次出现模式,使用g
选项替换全局所有出现模式。p
:缺省情况下sed
将所有被替换行写入标准输出,加p
选项将使-n
选项无效。-n
选项不打印输出结果。w
:文件名,使用此选项将输出定向到一个文件。
$ sed 's/night/NIGHT' input.txt #替换night为NIGHT
$ sed 's/\$//' input.txt #替换$符号为空,即删除,因为replace-pattern没有指定任何内容
$ sed 's/night/NIGHT/g' input.txt #全局替换
$ sed 's/night/NIGHT/w out.txt' input.txt #将替换结果写入一个文件