sed 工具基本使用方法

什么是 sed

sed 是流编辑器(Stream Editor),在Shell 脚本和 Makefile 中作为过滤器使用。把一个程序的输入引入 sed 的出入,经过一些列的命令转换为另一种格式输出。


sed 使用基础

处理文件的来源

sed 处理的文件来源有两种方式:

  • 标准输入重定向得到。比如将上一个程序的标准输出通过管道重定向到sed工具
  • 命令行参数传入。通过命令行参数可以一次传入多个文件,sed 会依次处理。

编辑命令方式

sed 的对文件的编辑命令也有两种方式:

  • 通过命令行参数传入
  • 写成一个脚本文件用参数-f指定

执行命令格式

命令的基本格式:

1. sed  option 'script' file
2. sed option -f 'scriptfile'  file

对文件进行编辑的脚本格式为:

/pattern/action

其中 pattern 是正则表达式,用来匹配文件中符合规则的文本内容。
action 是编辑操作,指定要对匹配到的内容作出什么样的操作。具体流程是,sed 一行一行读取内容,如果某一行与 pattern 规则匹配,则执行相应的 action。 如果没有指定 pattern,也就是为空,那么默认 action将作用于文件的每一行。

sed 在处理文件时,将文件的内容一行一行读取它进程中的缓冲区(也叫模式空间 pattern space),然后开始处理缓冲区中的内容,处理完毕后,把缓冲区的内容送到屏幕上,直到文件末尾。

有两点需要注意的:

  • sed 并不会改变原文件内容,如果需要改变可以加选项 -i 或者重定向 传输到别的文件。
  • sed 按照Basic 正则匹配内容。

小知识点:

什么是Basic 正则?
在Basic 规范中, 字符 {} | () ? + 被解释为普通字符,如果要表示特殊含义,则需要在前面加 \ 字符转义。比如我们在使用 grep 命令时,默认正则就是 Basic 规范。因为Basic 正则太过于繁琐,也不容易阅读,所以有了Extended 规范。grep 工具 如果需要使用Extended 规范,前面那些字符就不会被解释为普通字符,默认具有特殊含义。不过要使用 egrepgrep -E才可以使用Extended 规范。注意在 sed 中也可以加选项 -E 或者-r使用Extended 规范,后面有演示(我的环境是 Centos6.5)如不行,可自行查找方式。

常用选项(option)以及命令(action)

选项(option)

选项紧跟在sed 之后。

  • -n:只输出匹配 pattern 的行,不输出待处理文件的内容。
  • -i :会修改原文件
  • -e:进行多项编辑,指定多条sed 命令
  • -f:指定sed 脚本的文件名

命令(action)

sed 命令告诉 sed 如何匹配的各行,如果没有指定则处理所有的行。命令在 / 之后,也就是/pattern/action中action 的位置

  • p:将匹配 pattern 的行打印出来
  • d:将匹配 pattern 的行删除(默认删除只是不打印匹配的行,不是从哪个原文件中删除)
  • s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
  • s/pattern1/pattern2/g:查找符合pattern的行,将改行所有匹配pattern1的字符串替换为pattern2
    上述两条命令中:s 表示用一个字符串替换另一个,g 表示在行内进行全局替换
  • a:在当前行后面追加新的一行
  • c:用此字符后新的文本替换匹配行中所文本
  • i:在当前行之前插入一行,与a相对
  • l:列出非打印字符,如空格与制表符
  • w:将所选行写入文件

注意:
- pattern2 中 &表示原文件的当前行中与pattern1相匹配的字符
- pattern2 为空表示用空白替换
- pattern2 中的 \1 表示与pattern1 第一个() 内相匹配的内容,\2 表示与pattern1 的第二个()相匹配的内容。


小例子:

将一个*.c 文件中的所有printf 注释:

(1)在所有printf 前面添加注释

sed-注释添加

(2)将所有注释都取消
sed-注释取消

定址

定址用于指定对那些行进行操纵。定址的形式可以是数字、正则表达式或两者的结合,如果没有指定,默认处理所有行。

比如:
sed -n '4p' test.c 打印第四行

sed -n '3,6p' test.c 打印 3-6 行

sed '4,8d' test.c 删除4-8行

sed -n '/int/,/end/p' test.c 打印包含int的行和 end 的行 之间的内容

sed -n '/start/, 10/p' test.c 打印包含start行 到第10行的内容。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页