sed小结
?
sed [options] 'command' file(s) ??
sed [options] -f scriptfile file(s) ?
?
1.options
-n 取消默认输出,只有经过sed特殊处理行(或者动作)才会被列出来
-e 多重编辑模式
-f 指定sed脚本文件名
?
2. command
---------------------------------------------------------------
?
d ?从模板块(Pattern space)位置删除行
p ?打印模板块的行
?
sed '3d' file
sed '3,$d' file
sed '/line/'d file
?
sed 's/^[ ]*/g' file ? # ?delete spaces in front of each row
sed 's/^ */g' file ? ? # ?same as above
sed 's/^[[:space:]]*//g file # ?same as avove
?
echo "abc start\nefg middle\nhij end\nover" | sed -n '/start/,/middle/p' ? # "abc start\nefg middle"
echo "abc start\nefg middle\nhij end\nover" | sed -n '2,/end/p' ? # "efg middle\nhig end"
echo "abc start\nefg middle\nhij end\nover" | sed -n '/start/,/middle/s/$/123/p' ? # "abc start123\nefg middle123"
?
echo "abc\ndef\nghi\njkl" | sed -n '/def/p'# def ?<=> grep def
echo "abc\ndef\nghi\njkl" | sed '/def/!d'# def ?<=> grep def
echo "abc\ndef\nghi\njkl" | sed -n '/def/!p'# "abc\nghi\njkl" ?<=> grep -v def
echo "abc\ndef\nghi\njkl" | sed '/def/d'# "abc\nghi\njkl" ?<=> grep -v def
echo "abc\ndef\nghi\njkl" | sed -n ?'/def/{g;1!p;};h'# ?abc, 匹配行的前一行
echo "abc\ndef\nghi\njkl" | sed -n ?'/def/{n;p}'# ?ghi, 匹配行的后一行
?
?
---------------------------------------------------------------
?
s/re/string/ ?用string替换正则表达式re
echo "abcdefg" | sed 's/abc/123/g' ? ? ? ?# 123defg
echo "abcdefg" | sed -n 's/^abc/123/p' ? ?# 123defg
echo "abcdefg" | sed 's#\(abc\)defg#\1#' ?# abc
?
---------------------------------------------------------------
?
r file 从file中读行 ?eg: file contains "123\n456"
echo "abc\ndef" | sed '/abc/r file' ? # abc\n123\n456\ndef
?
w file ?向file中写行,清空原有文件内容
echo "abc\ndef" | sed -n '/abc/w file' ?# now, file content is "abc"
?
---------------------------------------------------------------
?
a\ 当前行后面加入一行文本
echo "abc\ndef" | sed '/^abc/a\123' ?# "abc\n123\ndef", '\'换行时,不可少,最后一行,可省略
?
i\ 在当前行前面插入一行文本
echo "abc\ndef" | sed '/^abc/i\123' # “123\nabc\ndef"
?
----------------------------------------------------------------
h ?将 hold space 中的内容使用 pattern space 中的内容来替换(清空暂存缓冲区)
H ?将 hold space 中的内容使用 加上一个 trailing newline,而后 append pattern space(不清空暂存缓冲区)
?
g ?将 pattern space 中的内容使用 hold space 中的内容来替换
G ?将 pattern space 中的内容使用 加上一个 trailing newline,而后 append hold space
?
! ? 表示后面的命令对所有没有被选定的行发生作用
echo "abc\ndef\nghi" | sed -e '/def/h' -e '$G' ?# ?"abc\ndef\nghi\ndef"
echo "abc\ndef\nghi" | sed -e '/def/H' -e '$G' ?# ?"abc\ndef\nghi\n\ndef"
echo "abc\ndef\nghi" | sed -e '/def/h' -e '$g' ?# ?"abc\ndef\ndef"
echo "abc\ndef\nghi" | sed -e '/def/H' -e '$g' ?# ?"abc\ndef\n\ndef"
?
echo "abc\ndef\nghi\njkl" | sed '1!G;h;$!d' ? ? # ?"jkl\nghi\ndef\nabc"
?
echo "abc\ndef" | sed G ? ? ? ? ? ? ? ? ? ? ? ? # ?"abc\n\ndef\n"
echo "abc\n\n\ndef" | sed '/^$/d;G'# ?"abc\n\ndef\n"
?
echo "abc\ndef\nghi\njkl" | sed '/def/{x;p;x;}' # ?"abc\n\ndef\nghi\njkl", add a blank line before the matching one
echo "abc\ndef\nghi\njkl" | sed '/def/G'# ?"abc\ndef\n\nghi\njkl", add a blank line after the matching one
echo "abc\ndef\nghi\njkl" | sed '/def/{x;p;x;G}'# ?"abc\n\ndef\n\nghi\njkl", add a blank line before and after the matching one
?
?
----------------------------------------------------------------
?
n ?读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
echo "abc\ndef" | sed '/abc/{n;s/e/E/;}' # ?"abc\ndEf"
echo "abc\ndef\nghi\njkl" | sed 'n;d' ?# ?"abc\nghi", delete the even lines
?
y与tr类似,字符替换
echo "abc\ndef" | sed '1y/abcdef/ABCDEF/' ?# ?"ABC\ndef"
?
----------------------------------------------------------------
?
= ?打印当前行号码
echo "abc\ndef\nghi\njkl" | sed -n '/def/=' ? # ?2
echo "abc\ndef\nghi\njkl" | sed -n '$='# ?4 ? <=> wc -l
?
----------------------------------------------------------------
?
q退出
echo "abc\ndef\nghi\njkl" | sed 2q# ?"abc\ndef" ?<=> head -2
echo "abc\ndef\nghi\njkl" | sed -e :a -e '$q;N;2,$D;ba' ? # ?jkl ?<=> tail -1
echo "abc\ndef\nghi\njkl" | sed '$!N;$!D'# ?"ghi\njkl" ?<=> tail -2
echo "abc\ndef\nghi\njkl" | sed '$!d'# jkl<=> tail -1
echo "abc\ndef\nghi\njkl" | sed ?-n '$p'# jkl<=> tail -1
?
?
3. meta characters
^锚定行的开始?
$锚定行的结束
.匹配一个非换行符的字符
*匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]匹配一个指定范围内的字符
[^]匹配一个不在指定范围内的字符
\(..\)保存匹配的字符
echo "abcdefg" | sed 's/\(abc\)def/\1***/' ? # abc***g
?
&保存搜索字符用来替换其他字符
echo "abcdefg" | sed 's/d/--&--/' ? # abc--d--efg
?
\<锚定单词的开始
\>锚定单词的结束
x\{m\}字符x重复m次
x\{m,\}字符x重复至少m次
x\{m,n\}字符x重复至少m次,至多n次
?