Not Only Algorithm,不仅仅是算法,关注数学、算法、数据结构、程序员笔试面试以及一切涉及计算机编程之美的内容 。。
你的位置:NoAlGo博客 » 技术 » ,

sed的使用方法

sed(stream editor),是一种以行为处理单元的流编辑器。使用sed可以方便地在脚本中完成一个或多个文本数据的添加、删除、替换等常见操作,配合正则表达式使用功能非常强大,本文将介绍sed的基本使用方法。

命令格式

sed处理文件时,把当前处理的行存储在临时缓冲区中,称为“模式空间"(pattern space),接着根据命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed的命令格式如下:

sed [options] 'command' file(s) 

其中options为操作的选项,command为操作的命令,file为待操作的文件。常用的选项包括:

  • –version: 显示版本号。
  • –help: 显示帮助信息。
  • -e(–expression=): 允许多重编辑,执行完前面指令继续执行后续指令。
  • -f(–file=): 执行后面文件包含的命令,允许用户把多个命令写到一个统一的文件中。
  • -r(–regexp-extended): 支持扩展的正则表达式,默认支持的是基础正规表达式。
  • -i(–in-place): 原地操作,直接修改原文件,而不是屏幕输出。
  • -n(–quiet): 安静模式,sed一般会自动打印模式空间的内容,这个选项可以取消默认的打印操作,只打印经过sed特殊处理的那些行。
  • -l(–line-length=): 设置一个命令处理的行的长度。
  • -u(–unbuffered): 尽量少用缓冲,可以尽快显示结果。

定址

sed可以指定都某些行进行特定处理,如果没有指定则默认对所有的行均进行操作。通常的选择方式包括:

  • n:第n行。
  • n1,n2:第n1行到第n2行。
  • n1,+N: 第n1行以及后面的N行。
  • n1,~N:第n1行以及后面的若干行,直到行号为N的倍数为止。
  • n1~d: 从n1行开始,每隔d行选择一次,如1~2选择所有奇数行,10~5选择第10、15、20、25等行。
  • /regexp/: 选择匹配正则表达式的所有行。
  • !: 在最后添加!号表示对已经选择的行取反。

一些简单的例子如下,暂时使用打印的命令p,而p一般会加参数-n,具体见下面介绍。

sed -n '1,3p' data     打印1到3行
sed -n '2,$p' data     打印2到最后一行
sed -n '/3rd/p' data   打印包含3rd的行
sed -n '/3rd/,4p' data 打印包含3rd的行到第4行
sed -n '/3rd/!p' data  打印不包含3rd的行
sed -n '2~2p' data     打印偶数行

正则表达式

sed只有包含正则表达式才能发挥完全的功能,下面简单介绍一下sed的正则表达式。

首先是关于匹配字符出现的次数:

  • *: 匹配一个或多个前面的字符。
  • \+: 匹配一个前面的字符。
  • \?:匹配零个或一个前面的字符。
  • \{i\}:匹配i个前面的字符。
  • \{i,j\}: 匹配i个到j个前面的字符。
  • \{i,\}:匹配i个或更多前面的字符。

然后是一些其他基本的内容:

  • \(regexp\):分组,把里面的正则表达式当做一个整体。
  • .: 匹配任何字符,包括换行。
  • ^: 匹配一行的开头。
  • $: 匹配一行的结尾。
  • \<: 表示词首。
  • \>: 表示词尾。
  • [list],[^list]: 匹配list里的任何单个字符,^表示取反,匹配不在list的任何字符。
  • regexp1\|regexp2: 匹配第一个表达式或第二个表达式。
  • \digit: 后向引用,匹配前面正则表达式的第i个分组。
  • \n: 匹配换行符。
  • \char: 匹配字符。

下面是一个简单的例子,其中的正则表达式匹配的含义为:\<1表示以1开头的单词,后面接[a-z]表示任意字母,\{2\}表示出现两次,外边的\(和\)表示当做一个整体,最终选中了1st这个单词,把它替换成xxx。

[noalgo@NoAlGo tem]$ cat data
This is 1st line.
This is 2nd line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed 's/\(\<1[a-z]\{2\}\)/xxx/g' data   
This is xxx line.
This is 2nd line.
This is 3rd line.
[noalgo@NoAlGo tem]$

常用命令

sed定义了很多对数据可以进行的操作,其中包括:

  • #: 开始一段注释。
  • a: 在当前行的下一行添加内容,添加多行时需要使用\续行。
  • i: 在当前行的前一行添加内容。
  • c: 用后面的内容代替当前行的内容。
  • s: 替换,通常搭配正则表达式使用,s/regexp/replacement/flags。
  • d: 删除当前行的模式空间,进入下一个周期。
  • p: 打印模式空间内容。
  • q: 退出,不再处理更多的命令或输入,一般无语法错误都返回0。

注意a和i的区别是一个插入在后面一个是插入在前面,而c和s的区别是c直接替换掉整行,s替换匹配的内容。注意,如果需要使用多条命令,需要用花括号将命令括起来,每行只写一条命令,或者用分号分割同一行中的多条命令。

下面是以上命令的一些使用例子。

[noalgo@NoAlGo tem]$ cat data
This is 1st line.
This is 2nd line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed '/2nd/a This is a new line.' data 在2nd一行后添加新一行
This is 1st line.
This is 2nd line.
This is a new line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed '/2nd/i This is a new line.' data 在2nd一行前添加新一行
This is 1st line.
This is a new line.
This is 2nd line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed '/2nd/c This is a new line.' data 把2nd一行替换成新行
This is 1st line.
This is a new line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed '/2nd/,$d' data 删除包含2nd的行到最后一行
This is 1st line.
[noalgo@NoAlGo tem]$ sed 's/2nd/xxx/g' data 把2nd替换成xxx,出现多次则替换多次   
This is 1st line.
This is xxx line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed -e 's/2nd/3rd/g' -e 's/3rd/2nd/g' data 多次操作            
This is 1st line.
This is 2nd line.
This is 2nd line.
[noalgo@NoAlGo tem]$ sed 'n;q' data  处理完第1行命令退出
This is 1st line.
This is 2nd line.
[noalgo@NoAlGo tem]$ 

其他命令

SED以行为单位的编辑文本,逐行处理并将输出结果打印到屏幕上,它使用了两个空间:

  • 模式空间(pattern space)
  • 暂存空间(holding space)

sed将当前处理的行读入模式空间(pattern space)进行处理,而暂存空间里默认存储一个空行,在该行执行完所有命令后将处理后的结果打印到屏幕上,然后其从模式空间中删除,将下一行读入模式空间,重新从第第一个命令开始以同样方式处理,直到文件的最后一行结束。
sed在模式空间对文件进行处理,不会修改原文件,除非包含-i选项。

下面是模式空间、暂存空间以及其它一些命令:

  • r: 从文件中读取输入行。
  • w: 将所选的行写入文件。
  • n: 读入下一行替换掉当前模式空间,执行下一条命令而不是第一条命令。读入下一行之前会先把当前行输出。
  • N: 读入下一行追加到当前模式空间。
  • g: 把暂存空间的内容替换掉模式空间的内容。
  • G:把暂存空间的内容追加到模式空间的后面。
  • h: 把模式空间里的行拷贝到暂存空间。
  • H: 把模式空间里的行追加到暂存空间。
  • x: 交换暂存缓冲区与模式空间的内容。

下面是使用r命令和w命令的例子。

[noalgo@NoAlGo tem]$ cat data 文件data的内容
This is 1st line.
This is 2nd line.
This is 3rd line.
[noalgo@NoAlGo tem]$ cat data2 问data2的内容
This is another line.
[noalgo@NoAlGo tem]$ sed '/2nd/r data2' data 在含有2nd的行读入data2文件的内容
This is 1st line.
This is 2nd line.
This is another line.
This is 3rd line.
[noalgo@NoAlGo tem]$ sed -n '/2nd/w data2' data 把含有2nd的行写入data2文件里
[noalgo@NoAlGo tem]$ cat data2
This is 2nd line.

下面是使用n命令和N命令的例子。
使用n时,读入第1行,执行n命令,输出第1行,读入第2行,替换掉第1行,执行d命令,删除掉现有的第2行。
使用N时,读入第1行,执行N命令,读入第2行,追加到第1行末尾,执行d命令,删除所有行。没有任何输出。

[noalgo@NoAlGo tem]$ cat data        
This is 1st line.
This is 2nd line.
[noalgo@NoAlGo tem]$ sed '{n;d}' data 
This is 1st line.
[noalgo@NoAlGo tem]$ sed '{N;d}' data
[noalgo@NoAlGo tem]$ 

下面是使用g命令和G命令的例子。
使用g时,读入2nd所在第2行,把暂存空间里的换行替换掉第2行,于是只输出了一个换行。
使用G时,读入2nd所在第2行,把暂存空间里的换行追加到第2行,于是输出第2行以及一个换行。

[noalgo@NoAlGo tem]$ cat data
This is 1st line.
This is 2nd line.
[noalgo@NoAlGo tem]$ sed '/2nd/g' data
This is 1st line.

[noalgo@NoAlGo tem]$ sed '/2nd/G' data         
This is 1st line.
This is 2nd line.

[noalgo@NoAlGo tem]$ 

sed脚本

sed脚本就是写在文件中的一系列sed命令。脚本一般是一行一个命令,如果一行中有多个命令,要用分号分隔。脚本中命令的末尾不能有任何多余的空格或文本。
执行脚本时,sed先将输入文件中第一行复制到模式缓冲区,然后对其执行脚本中所有的命令。每一行处理完毕后,sed再复制文件中下一行到模式缓冲区,对其执行脚本中所有命令。

使用脚本时,通过如下命令进行调用,起重工script.sed为脚本文件,data为数据文件。

sed -f script.sed data
上一篇: 下一篇:
  1. #广东硅谷学院#学好IT好就业选硅谷IT,学技能拿文凭事半功倍,紧跟专业教师一起冲浪IT行业。我们有建设学习型专业师资团队,教师领跑学生紧随其后。(QQ:800015777,电话0754-88989555)

我的博客

NoAlGo头像编程这件小事牵扯到太多的知识,很容易知其然而不知其所以然,但真正了不起的程序员对自己程序的每一个字节都了如指掌,要立足基础理论,努力提升自我的专业修养。

站内搜索

最新评论