sed 文本处理几个简单的例子


一、简介

sed(意为流编辑器,源自英语 “stream editor” 的缩写)是 Unix 常见的命令行程序。

sed 用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出。

sed 通常用来匹配一个或多个正则表达式的文本进行处理。

引用自:sed – 维基百科


二、命令用法

sed [选项] <脚本文件或指令> [输入文件]
选项 功能
-n 不输出所有行。
-e 使用多个脚本或指令。
-f 使用脚本文件。
-i 直接修改文件。

sed 默认将处理结果输出至 stdout,如果不指定输入文件,则使用 stdin 输入。

需要使用多个指令时,可以用 ; 隔开,或者在每个指令前加上选项 -e

常用指令 功能
c 替换整行。
s 替换匹配的字符串。
a 在下一行追加。
i 在上一行追加。
y 逐字符替换。
d 删除。
p 打印。
w 保存文件。
q 退出。

常用指令很多跟 vim 差不多,sed 也可以说是 vim 的命令行版。


三、举例

3.1 示例文件内容

[root: ~]# cat -n test.txt
     1  abc
     2  aaaaaaa
     3  1234
     4  
     5  aa
     6  aa1234
     7  abcde
     8  
     9  #aaa
    10  ffff
    11  hhhh
    12  
    13  aaaa
    14  
    15  qqqq

3.2 举例说明

打印第 9-11 行

[root: ~]# sed -n '9,11p' test.txt | cat -n
     1  #aaa
     2  ffff
     3  hhhh

将行首字母 a 替换为 z

[root: ~]# sed 's/^a/z/1' test.txt | cat -n
     1  zbc
     2  zaaaaaa
     3  1234
     4  
     5  za
     6  za1234
     7  zbcde
     8  
     9  #aaa
    10  ffff
    11  hhhh
    12  
    13  zaaa
    14  
    15  qqqq

删除空白行

[root: ~]# sed '/^$/d' test.txt | cat -n
     1  abc
     2  aaaaaaa
     3  1234
     4  aa
     5  aa1234
     6  abcde
     7  #aaa
     8  ffff
     9  hhhh
    10  aaaa
    11  qqqq

在含有 d 的行前后追加 \(反斜杠)

[root: ~]# sed '/d/i \\\' test.txt | sed '/d/a \\\' | cat -n
     1  abc
     2  aaaaaaa
     3  1234
     4  
     5  aa
     6  aa1234
     7  \
     8  abcde
     9  \
    10  
    11  #aaa
    12  ffff
    13  hhhh
    14  
    15  aaaa
    16  
    17  qqqq

将第 6 行替换为 xxxx

[root: ~]# sed '6c xxxx' test.txt | cat -n
     1  abc
     2  aaaaaaa
     3  1234
     4  
     5  aa
     6  xxxx
     7  abcde
     8  
     9  #aaa
    10  ffff
    11  hhhh
    12  
    13  aaaa
    14  
    15  qqqq

将行首的 # 号去掉

[root: ~]# sed 's/^#//g' test.txt | cat -n
     1  abc
     2  aaaaaaa
     3  1234
     4  
     5  aa
     6  aa1234
     7  abcde
     8  
     9  aaa
    10  ffff
    11  hhhh
    12  
    13  aaaa
    14  
    15  qqqq

删除第 10 行

[root: ~]# sed '10d' test.txt | cat -n
     1  abc
     2  aaaaaaa
     3  1234
     4  
     5  aa
     6  aa1234
     7  abcde
     8  
     9  #aaa
    10  hhhh
    11  
    12  aaaa
    13  
    14  qqqq

在第一行前面加上 hello 一行,并保存到文件中

[root: ~]# sed -i '1i hello' test.txt ; cat -n test.txt 
     1  hello
     2  abc
     3  aaaaaaa
     4  1234
     5  
     6  aa
     7  aa1234
     8  abcde
     9  
    10  #aaa
    11  ffff
    12  hhhh
    13  
    14  aaaa
    15  
    16  qqqq

在最后一行后面加上 goodbye 一行,并保存到文件中

[root: ~]# sed -i '$a goodbye' test.txt ; cat -n test.txt 
     1  hello
     2  abc
     3  aaaaaaa
     4  1234
     5  
     6  aa
     7  aa1234
     8  abcde
     9  
    10  #aaa
    11  ffff
    12  hhhh
    13  
    14  aaaa
    15  
    16  qqqq
    17  goodbye

发表评论