Sed Stream Editor
行编辑器(全屏编辑器:vi)
逐行读取到模式空间,处理完之后输出 默认不修改源文件,
仅对模式空间中的数据做处理,处理完之后将模式空间的内容追行打印
sed 'Address Command' file... ‘’ “” 都可以,如果有变量用弱引用
Address
1、StartLine,EndLine
1,100
$ 最后一行
$-1 倒数第二行
2、/RegExp/
/^root/ '/oot/d'
3、/pattern1/,/pattern2/
第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束
4、LineNumber
指定的行
5、StartLine, +N
从startLine开始,向后的N行
Command
-i 直接修改源文件
-n 静默模式,不再显示模式空间中内容
-e SCRIPT -e SCRIPT 可以同时执行多个脚本(COMMAND)
sed --e '1,10d' -e 's/L\(..e\)r/l\1/g' /shell/1
-f 用脚本处理/PATH/TO/SED_SCRIPT
vi /shell/script
2a\two numbers
4s/#/@/g
$i\end numbers
sed -f /shell/script /shell/1
-r 适用扩展正则表达式
错误的写法 history | sed -r 's/^[[:space:]]\(.*\)/\1/'
d 删除行
sed '1d' 删除第一行
sed '3,$d' /tmp/inittab 删除第三行到最后一行
sed '1,+2d' /tmp/inittab 删除第一行到第三行
sed '/^\//d' /etc/fstab 删除以\开头的行
p 显示匹配到的行
sed '/^\//p' /etc/fstab 匹配到的显示2次,因为sed默认会显示模式空间的行
sed -n '/^\//p' /etc/fstab
a \string 在匹配到的行后面,追加新行,内容为"string" a后面加\利于实现特殊字符
sed '/^\//a\# hello world \n#hello linux' /etc/fstab 在\开头行后加2行注释
sed '/^\//a#hello\n#hello' /etc/fstab a
i \string 在匹配到的行前面,追加新行,内容为"string"
r file 将制定文件内容添加至符合条件的行后
sed '2r /etc/inittab' /shell/1
sed '1,2r /etc/inittab' /shell/1 第一行后面添加一遍,第二行后面添加一遍
w 将指定范围内的内容另存至指定的文件中,如果是已存在文件会覆盖其内容,如果不存在会建立文件并保存内容
sed -n '/^#/w /shell/2' /etc/inittab
s /pattern/string/ 查的并替换 默认开始只替换每行的第一个
sed '1,3s/#/$/' /shell/1
sed 's/^\//#/' 2 替换以/开头的行为#
sed '1s/#/$/;3s/#/$/' /shell/1 替换第一行第三行第一个匹配到的
修饰符
g 全部替换
sed '1s/#/$/g;3s/#/$/' /shell/1 替换第一行全部和第二行第一个匹配到的
i 匹配时忽略大小写
sed 's/inittab/haha/ig' /shell/1 替换全文inittab时忽略大小写,替换为haha
s /正则表达式/字符串( 支持引用,不支持正则)/ s$$$ s@@@ s%%% 这样不适用查找中带有的,平时适用/,这样查找/是就不用转义了
后向引用 \(\) \1 \2
l..e like --> liker love -->lover 两种实现 \(\) &
sed 's/\(l..e\)/\1r/' /shell/1
& 引用模式匹配整个串
sed 's/l..e/&r/' /shell/1
只引用一部分的时候,后项引用可以细化第一个pattern,&则是全部匹配,
实现like --> Liker love -->Lover
sed 's/l\(..e\)/L\1r/g' /shell/1
现实删除history前面的空白字符
history | sed -r 's/^[[:space:]]*//g'
练习
1、删除/etc/grub.conf文件中行首的空白字符
sed 's/^[[:space:]]*//' /etc/grub.conf
2、替换/etc/inittab文件中“id:5:initdefault:"一行中的数字为3;
sed 's/^\(id\):5:\(initdefault\)/\1:3:\2/' /etc/inittab
3、删除/etc/inittab文件中的空白行
sed '/^$/d' /etc/inittab
4、删除/etc/inittab文件中开头的#号,但要求#号后面必须有空白字符
sed 's/^#\([[:space:]]\+\)/\1/' /shell/inittab
5、删除/etc/inittab文件中开头的#号和空白字符,但要求#号后面必须有空白字符
ed -r 's/^#[[:space:]]+//' /shell/inittab
sed 's/^#\([[:space:]]\+\)//' /shell/inittab
6、取出一个文件路径的目录名称
echo "/shell/asdasd/inittab" | sed 's/^\(.*\)\/.*$/\1/'
echo "/shell/haha/inittab" | sed 's#^\(/.*\)/.*#\1#'
echo "/shell/haha/inittab/" | sed -r 's#^(/.*/)[^/]+/?#\1#'
7、取得路径基名
echo "/shell/haha/inittab/" | sed -r 's#^/.*/([^/]+)/?#\1#'
8、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及其#
sed 's/^[[:space:]]#\(.*\)/\1/' /shell/inittab
















