sed 是一种在线编辑器,它一次处理一行内容.可以在不用打开文件进行类似vim的操作,如插入、删除、替换等.

Usage

sed [options] 'pattern + action' file(s) 
pattern: 行号、匹配等
action: 动作

options

  • -h 帮助
  • -v 版本
  • ….

可以man来查看帮助

command

名称|命令|语法|说明 |:– 替换|s|[address]s/pattern/replacement/flags |替换匹配的内容,flags有1-255表示替换几次,g全局替换,p打印匹配,w file写入匹配 删除|d|[address]d|删除匹配的行 插入|i|[line-address]i\text|在匹配行的前方插入文本,输入方法:sed ‘1i\换行text换行’ 追加|a|[line-address]a\text|在匹配行的后方插入文本,输入方法:sed ‘1a\换行text换行’ 行替换|c|[address]c\text|将匹配的行替换成文本text 打印行|p|[address]p|打印在模式空间中的行 打印行号|=|[address]=|打印当前行行号 打印行|l|[address]l|打印在模式空间中的行,同时显示控制字符 转换字符|y|[address]y/SET1/SET2/|将SET1中出现的字符替换成SET2中对应位置的字符,SET1表示字符集,如sed ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’表示小写替换成大写 读取下一行|n|[address]n|将下一行的内容读取到模式空间 读文件|r|[line-address]r file|将指定的文件读取到匹配行之后 写文件|w|[address]w file |将匹配地址的所有行输出到指定的文件中 退出|q|[line-address]q|读取到匹配的行之后即退出

源内容:

xuwenfadeMacBook-Pro-2:sed_test wenva$ ls
1.txt
2.txt
3.txt
  • s/re/string/ 替换,如果是s/re/string/g则全局替换
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 's/1/5/'
5.txt
2.txt
3.txt

PS: s///是一个替换命令,可以跟其他命令组合,比如

bogon:9 starnet$ ls|sed '1s/txt/doc/'
1.doc
2.txt
3.txt

PS: 表示只替换第一行

bogon:9 starnet$ ls|sed -n  -e '/1/,/2/s/txt/doc/gp'
1.doc
2.doc

PS: 从匹配1的行开始,以含有2的行结束(至少第二行,找不到则默认到最后一行),替换txt为doc,并通过p打印,-n表示不输出每行内容.

  • = 显示行号
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed '='
1
1.txt
2
2.txt
3
3.txt
  • d 删除行, 2d删除第二行,$d删除最后一行,2,$d删除第二行到尾行
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 'd'

元字符

  • ^ 行首,如行首插入0
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 's/^/0/g'
01.txt
02.txt
03.txt
  • $ 行尾,如行尾插入0
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 's/$/0/g'
1.txt0
2.txt0
3.txt0
  • . 一个任意字符,如将所有字符替换为0
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 's/./0/g'
00000
00000
00000
  • * 零或多个字符
  • [] 范围内
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 's/[1].txt/asdf/g'
asdf
2.txt
3.txt
  • [^] 范围外
xuwenfadeMacBook-Pro-2:sed_test wenva$ ls|sed 's/[^1-2].txt/asdf/g'
1.txt
2.txt
asdf

多行模式

  • n - 读取下一行,并替换上一行
  • N - 读取下一行,并追加到上一行尾部
  • p - 打印模式空间内全部内容
  • P - 打印第一行(\n)
  • d - 删除模式空间全部内容,并重头开始sed
  • D - 删除第一行(\n),对剩余模式空间重新sed
合并2行
sed '$!N;s/\n/ /'

PS: $表示最后一行,!表示非,$!N表示最后一行不N,其他都是N

Pattern Space 和 Hold Space

  • Pattern Space - 模式空间(流水线)
  • Hold Space - 保存空间(类似于仓库)
  • g - Hold -> Pattern
  • G - Hold 追加-> Pattern
  • h - Pattern -> Hold
  • H - Pattern 追加-> Hold
  • x - Hold 交换 Pattern
反序输出
sed ‘1!G;h;$!d’mm