Linux sed 速查手册

459 阅读4分钟

启动 sed 编辑器

sed 命令的格式:sed options script file

-e script   将script中指定的命令添加到处理输入时运行的命令中 
-f file     将file文件中指定的命令添加到处理输入时运行的命令中 
-n          不要为每条命令产生输出,但会等待打印命令 
# 只有加上 -i 参数才会修改原文件,不然全是修改的数据流文本
-i[SUFFIX]  在原文件上修改,如果指定 SUFFIX,会将更新前的文件备份,文件名为原文件名+SUFFIX
-c          与 -i 搭配使用,复制一份更新前的文件,文件名固定为原文件名+c

script 参数指定了作用在数据流上的单条命令。如果需要不止一条命令,要么用 -e 选项在 命令行上指定它们,要么用 -f 选项在一个单独文件中指定它们

# 两个命令都作用到数据流中的每行数据上
sed -e 's/brown/green/; s/dog/cat/' data1.txt 

sed 命令

替换

s 命令会替换输入流中的文本,格式为:s/pattern/replacement/flags

其中 pattern 是要被替换的文本,replacement 是 sed 要插到数据流中的新文本

flags 参数控制如何进行替换,有 4 种类型的替换标记可用:

  1. 一个数字,表明该模式出现的第几处应该被替换
  2. g: 表明所有该文本出现的地方都应该被替换
  3. p: 表明原来行中的内容应该被打印出来
  4. w file:表明替换的结果应该写入到文件 file 中

寻址

默认情况下,在 sed 编辑器中使用的命令会作用在文本数据的所有行上。如果想让命令只作用在指定行或一组行上,就必须使用行寻址(line addressing)

在 sed 编辑器中,有两种形式的行寻址:

  1. 行区间(数字形式)
  2. 可以过滤出特定行的文本模式
# 将 data1 数据流中的 2/3 行的 dog 替换为 cat
sed '2,3s/dog/cat/' data1 

# 将数据流中包含 rich 的行的 bash 替换为 csh
sed '/rich/s/bash/csh/' /etc/passwd 

# 将每一条替换命令都作用在数据流的第 2 行上
sed '2{ 
> s/fox/elephant/  
> s/dog/cat/  
> }' data1 

删除行

# 所有的行都会被从数据流中删掉
sed 'd' data1 

# 从流中删除第 3 行
sed '3d' data6 

# 从流中删除 2/3 行
sed '2,3d' data6 

# 从流中删除包含 number 1 的行
sed '/number 1/d' data6 

插入和附加文本

  • 插入(insert)命令(i)在指定行前面添加一个新行
  • 附加(append)命令(a)在指定行后面添加一个新行

格式为: sed '[address]command new line'

注意: 这里也是会修改数据流中的文本,不会修改原文件,要与 -i 参数区分开,只有加上 -i 参数才会修改原文件

echo "testing" | sed 'i\ 
> This is a test' 
# This is a test 
# testing 

# 在数据流第 2 行前插入新行,即新插入行将在第 2 行
sed '2i insert new line' data.txt

# 在原文件第 2 行前插入新行
sed -i '2i insert new line' data.txt

echo "testing" | sed 'a\  
> This is a test' 
# testing  
# This is a test  

# 在数据流第 2 行后插入新行,即新插入行将在第 3 行
sed '2a insert new line' data.txt

修改行

# 替换数据流中第 3 行数据
sed '3c replace third line' data.txt

转换命令

转换(transform)命令(y)是唯一一个作用在单个字符上的sed编辑器命令,格式为:[address]y/inchars/outchars/

转换命令对 incharsoutchars 执行一对一的映射。inchars 中的第一个字符会转换为 outchars 中的第一个字符,inchars 中的第二个字符会转换为 outchars 中的第二个字符,依此 类推,直到超过了指定字符的长度。如果 incharsoutchars 长度不同,sed 编辑器会报错

# 替换数据流中所有的 m 为 n
sed 'y/m/n/' data.txt

# 替换数据流中第 2 行的 m 为 n
sed '2y/m/n/' data.txt

打印行

# -n 参数让 sed 不输出,p 让数据流中包含 number 3 的行输出
sed -n '/number 3/p' data6 

写入到文件

w 命令用来将文本行写入到文件中,格式为: [address]w filename

# 将 data6 的第 1/2 行写入到 test
sed '1,2w test' data6 

从文件中读取

读取(read)命令(r)允许插入单个文件中的数据,格式为: [address]r filename

# 将 data 文件中的全部文本插入到 data2 文件中第 3 行后
sed '3r data' data2 


参考:《Linux命令行与Shell编程大全(第3版)》