Stream Editor
sed会逐行读取数据到模式空间处理,之相对保持空间用来临时倒腾.
- 注意: 参数是首先传递给shell,shell会先做一层转义!
- 注意: 只支持
BRE
的大部分,不支持ERE
! - 注意: pattern中的以下字符需要转义(
[]
内除外!):\ / . * ^ $ []
basic
-n
: 每次处理后不打印结果,通常配合p命令以便打印指定行-f
: 指定shfile, sed -n -f shfile file > outfile
-i
: 直接修改读取的文件,而不是输出到终端!-e
: 多个命令.如搜索f的每一行,将具有o行的i全部大写+将每行的第1个e替换为1: sed '/o/{s/i/I/g;s/e/1}' f
替换模式
是搜索模式的子集,跟在s后面的都可以算作分隔符!
[range]s/pattern/replace/flag
注意: 必须加足了3个’/’,即使后面没有flag!
- flag:
g :替换该行的所有匹配. 2:只替换该行的第2个匹配! - range:
注意:不支持vim-ed
中的%
(每一行),实际上sed本来就是一行一行的处理数据!$
: 单独使用时表以后一行或最后一个匹配;$p
:表当处理到最后一行时才打印!!
: 用于对命令取反,必须配合前面的范围!如打印除2-8行以外的行:sed -n '2,8!p'
/old,/new/!d
: 指定范围除外其他删除,注意整找不到new则范围会延伸到文末. - demos:
/old/(&)/pg
: 搜索file中每一行,将具有old行的:每一个’old’都加上括号!
搜索模式
p
: 打印模式空间的内容($p
表只打印最后一个匹配);P
: 只打印多行匹配中的第1行.q
: 打印并退出=
: 打印行号l
: 列出,打印出特殊字符,如TAB
会显示成\t
.l
: list行,特殊字符也会以\0xx
八进制显示,制表符会打印成符号\t
.r
: 追加某个文件的内容到指定位置的下一行;如: sed '/old/r new.txt' file
w
: 只把那些被改变(改变后的)或指定的行写入到文件!如将前2行写入到f: sed '1,2w f' file
d
: 删除pattern-space中的所有内容,并读入下一行(源文件仍不会变);如删除第2到最后一行: 2,$d
D
: 配合N,只删除多行匹配中的第1行且不会读入下一行!y
: 转换:如将file中所有的1变为a,2变为b…‘y/12345/abcde’n
: 将下一行复制到模式空间(会替换):如搜索file中每一行,将具有old行的下一行的第1个1替换为2: /old/{n;s/1/2/}
N
: 将下一行追加到模式空间,以便识别某些跨行的短语!中间的换行符使用’.‘来表示;注意没有下一行会终止,因此最后一行会被忽略!h
: 将模式空间的内容复制到保持空间(会替换); H
:追加g
: 将保持空间(保持空间默认是一个’\n’)的内容复制到模式空间(会替换); G
:追加x
: 交换两个空间的内容(会替换)!一些示例:i\
: 在行的前面插入新行!sed '3i\insert line' f
:第3行的前面插入a\
: 在行的后面插入新行!sed '$a\append line' f
:最后一行附加c\
: 替换匹配的行(整行)!sed [option] '/pattern/{[range]s/pattern/replace/flag}' file
# 模拟tac程序,倒序输出文本.当处理到最后一行时打印模式空间的内容!
sed -n '{1!G; h; $p}' file
# 除最后一行,每一行都多加一个空行(默认保持空间有一个空行).
sed '$!G' file
# b :branch,必须配合前面的范围,以实现满足条件时执行label后的命令!
# 可以指定跳转到的label,最多七个字符.示例:
sed '/word/b jmp1; s/old/NoJmpOn/; :jmp1; s/old/JmpOn}' file
# t :testing,必须配合前面的范围,以实现满足条件时跳过label后的命令,而不满足时则会执行!
# 可以指定测试的label,最多七个字符.示例:
sed '/word/t tes1; s/old/NoJmpOn/; :tes1; s/old/JmpOn}' file