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浏览输入文件时,缺省从第一行开始,有两种方式定位文本:

  1. 使用行号,可以是一个简单的数字,或是一个行号范围。
  2. 使用正则表达式

下表给出使用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! 查询不包含指定行号xy的行,如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\通知seda\后的文本进行实际附加操作。每一行有一个斜线表示换行。最后一行不加斜线,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 #将替换结果写入一个文件

5. 使用替换修改字符串

6. 将sed结果写入文件命令

7. 从文本中读文本

8. 匹配后推出

9. 显示文件中的控制字符

10. 使用系统sed

11. 快速一行命令

results matching ""

    No results matching ""