shell--学习 sed
sed:数据流编辑器
读一行到内存处理一行然后输出一行。
模式空间:
sed:默认不编辑源文件
sed [option] ADDRESSCOMMAND file
1、起始行、 结束行
sed startline,endline file sed 2,5p file
2、模式匹配 /模式/
sed /^root/p file 匹配到会打印两次,因为每个本身都要打印
3、 /模式1/,/模式2/
sed /^l/,/^h/p file 以l开头的行到以h结尾的行,都指第一次匹配的
4、只给一个数值,行号,表示精确指定某行
sed 5p file
5、指定起始行,使用+N,表示从指定的行开始,向后的N行,共N+1行内容
sed 10,+5 file
sed命令:
p:显示符合条件的行
d:删除符合条件的行 sed /^' '/d file 删除空白开头的行
a: append 用法:a \string 在指定的行后追加新行,内容为string
# sed '/d$/a \hello world\nhello world' file 在以d结尾后面加两行内容
其实就把这些内容当成一个字符串追加进来,只是\n在文本里被当成换行符处理了
i:insert 用法:i \string 在指定的行的前面插入新行。内容为string \n
r:r filename 将指定的文件的内容添加至符合条件的行处 sed '/d$/r/root/t2' t
w:w filename 将指定范围内的内容另存为到指定的文件中(重复会覆盖) sed /d$/w /tmp/d.txt t
s:查找并替换。s/匹配模式/要替换的内容/;@ # $ % a
每行所有匹配到的内容都替换:
g:全局替换 sed s/d/D/g file sed/s/l..e/&r/g file &指匹配的整体
i:查找的时候忽略字符的大小写
sed的选项:
-n:静态模式,不显示模式空间中的内容,只显示匹配条件的行 sed -n 1p file
-r:使用扩展正则表达式 sed -r s/(l..e)(m+)/\1r\2xx/g file \1指括号里的整体(后向引用) 不用转义括号
-i:直接修改源文件
练习:
有一个文本文件:
username,age,gender,salary
zhangsan,20,F,2000
sed的后向引用:
&表示引用模式匹配的整个字符串
练习:
1、将history命令的结果行首的空白字符删掉[[:space:]]
history | sed s/^[[:space:]]//g
2、取出一个文件路径的父目录 比如/var/log/mysql/acces.log ===>/var/log/mysql/
echo"/var/log/mysql" | sed -r 's#^(/?.*/).+/?#\1#g'
3、删除文件中以空白字符+#开头的行中的空白字符及#
#asdsdasd
==>
asdasd
sed -r s/^[[:space:]]+#//g file
sed -r 's/^(l.*e$)/#\1/g' file 给l开头e结尾的加注释#