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