工作原理:
sed(streams editor)是一个文本过滤器,一次处理一行内容,先把当前处理的行存储在临时缓冲——称为“模式空间”(pattern space),然后处理缓冲区中的内容,再将结果输出到屏幕,然后继续处理下一行,不断重复直到文件末尾。这一过程中原文件内容不变,除非你使用重定向存储输出,或者使用 "-i" 选项(即inline edit,行内编辑)。
pattern space :处理缓冲
hold space: 这个缓冲可用作临时备份
命令格式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
常用:
# 元字符:
^ #锚定行的开始
$ #锚定行的结束
. #匹配一个非换行符的字符
* #匹配零或多个字符
[] #匹配一个指定范围内的字符
[^] #匹配一个不在指定范围内的字符
\(..\) #保存匹配的字符
& #代表搜索表达式
echo "i love it" | sed s/love/**love**/ #i **love** it
\< #锚定单词的开始
\> #锚定单词的结束
x\{m\} #字符x重复m次
x\{m,\} #字符x重复m次及以上
x\{m,n\} #字符x重复m~n次
# 删除(d)
sed '2d' # delete line 2
sed '2,5d' # delete line 2~5
sed '2,$d' # delete line 2~last
sed '/test/'d # delete line contain "test"
sed 's/^[ \t]*//;s/[ \t]*$//' # 删除行前&行尾空格或者TAB
# 替换(s)
sed s/foo/bar/ # 仅匹配第1个
sed s/foo/bar/g # 全行匹配
sed s/foo/bar/4 # 仅匹配第4个
sed -n s/foo/bar/p # 仅打印被替换的行
sed 's/\(foo\)/\1+/' # foo => foo+ (\1=foo)
sed 's#10#100#g' # 紧跟s的字符("#")被当作分隔符
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
sed 's/\(.*\)foo/\1bar/' # 替换最后一个“foo”
sed '/baz/s/foo/bar/g' # 行中出现baz才替换
sed '/baz/!s/foo/bar/g' # 行中未出现baz才替换
# 行范围选定(,)
sed -n /foo/,/bar/p # print line /foo/ ~ /bar/
sed -n 2,/foo/p # print line 2 ~ /foo/
sed '/foo/,/bar/s/$/_end/' # 在line /foo/ ~ /bar/ 后面追加"_end"
# 命令组合(e)
sed -e '1,5d' -e 's/test/check/'
sed --expression='s/test/check/' --expression='/love/d'
# pattern & hold space相关
sed G # 在每行后面增加一个空行
sed '/^$/d;G' # 将多个空行合并成一个
sed 'G;G' # 在每一行后面增加两个空行
sed 'n;d' # 删除所有偶数行
sed '/regex/{x;p;x;}' # 在/regex/对应行之前插入一个空行
sed '/regex/G' # 在/regex/对应行之后插入一个空行
sed '/regex/{x;p;x;G;}' # 在/regex/对应行之前和之后各插入一个空行
# 其它
sed -n '$=' # 打印文本总行数