Skip to content

Linux sed

harryfyodor edited this page Jul 21, 2017 · 8 revisions

sedstream editor的简称,即流编辑器。一般来说是用来处理文本的。在使用的过程中会使用到大量的正则表达式。

本文会参考众多网上sed的教程,做一个记录和整合,当做自己今后的备忘录。

主要参考的教程如下所示:

1 一些基本的认识

  1. 存在一个pattern space的空间,可以想象成一个暂存的空间。
  2. 匹配是一行一行匹配的,事实上是对进行匹配或操作。

2 添加的参数以及含义

  • -e 用选项中指定的script来处理,可以指定多个脚本
  • -f 用选项中制定的script文件来处理
  • -i 直接修改源文件
  • -n 不把pattern space的内容打印出来

3. 命令

3.1 s命令

s命令用于匹配。下面是常用的格式。

范围s/要匹配的字符串或者正则/要用于替换的字符串/模式
  • 范围:匹配的行的范围。默认全部,3,6则表示第三行到第六行。
  • 要匹配的字符串或者正则:匹配的部分,而如果使用s命令,则是后面需要被替换的部分
  • 要用于替换的字符串
  • 模式:常用模式是g,即全部匹配。如果是1,则表示匹配第一个。3g则表示从第三行开始到最后。

例子:

sed "3,6s/my/your/g" pets.txt

3.1.1 常用正则

  • ^表示以什么开头。
  • $表示以什么结尾。
  • \<\> 表示以什么开头或者结尾的词。<\abc\>即严格匹配abc
  • .任何单个字符。
  • *出现0次或者多次。
  • \+出现1次或者多次。
  • \{m,n\}匹配前面符号出现m次到n次的词。
  • [^]指定不存在。

3.1.2 多个匹配和圆括号匹配

指定多个匹配方式,连续操作。

sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

圆括号匹配一般是为了修改格式。在后面的用于替换的字符串中可以使用\1之类的来代替前面括号匹配到的东西。

sed 's/This is my \([^,&]*\)\./\1/g' my.txt

3.2 其他命令

其他命令有多种使用的方式。主要针对下面从a到p命令来说,可以有如下的使用方式:

  • 操作的行数 命令 内容,具体例子sed "1 i This is my monkey" my.txt
  • /匹配的字符串/命令 内容,具体例子sed "/fish/a This is my monkey" my.txt。 下面就介绍每一种命令的具体功能。
  • N命令

要记住sed匹配的单位是行。而N命令则可以把计数行和偶数行用\n结合起来,共同匹配。

sed 'N;s/my/your/' pets.txt
  • a命令:append插入后面。
  • i命令:insert插入前面。
  • c命令:替换匹配行。
  • d命令:删除匹配行。
  • p命令:打印匹配行。

4 其他

4.1 打包命令

打包命令颇有一种逻辑操作的感觉,所以下面用逻辑操作的角度来说一下:

  • 与操作。两个匹配方式都需要满足才能起作用。
sed '3,6 {/This/{/fish/d}}' pets.txt
  • 或操作。两个匹配方式满足一个就可以操作。
sed '1,${/This/d;s/^ *//g}' pets.txt

4.2 使用Pattern Space

熟练使用sedPattern Space可以实现很多很神奇的功能。比如翻转行等等。由于目前本人用得不多,所以这里不加赘述。感兴趣可以看看上面酷壳的教程。

Clone this wiki locally