sed:(stream editor)流编辑器
逐行读入,逐行编辑。只处理模式空间,同时还有保留空间。
sed命令将符合条件的内容读取至模式空间内,只处理模式空间内的内容,默认不对源文件进行修改。然后将操作的结果输出到屏幕上。
#sed [OPTION] '[PATTERN][COMMAND]' INPUTFILE
[OPTION]
-n --quiet 静默模式。使用此选项后只打印指定条件的行。不显示模式空间内的内容。
-r 使用扩展的正则表达式。
-i 直接修改源文件。
-f SCRIPTFILE
使用名为SCRIPTFILE的脚本文件作为匹配条件。
CSRIPTFILE中每一行内容为一个匹配条件。
-e SCRIPT1 [-e SCRIPT2]....
使用-e可以在命令中使用多个脚本。
[PATTERN]([ADDRESS]定界地址):
1.STARTLINE[,ENDLINE]|[, +NUM]开始行和结束行。
只有一个行号表示精确指定某行。
+NUM表示以STARTLINE开始,向后NUM行。总计是NUM+1行。
例如:
1,100
33
2,+5
2.$ 最后一行
例如:
$-1 倒数第二行。
3.~ 跨步数值 指定一个行数的步进值。
4./RegExp/ 使用//将正则表达式圈起来。
例如:
/^root/
5./PATTERN1/,/PATTERN2/
第一次被PATTERN1匹配到的行开始,至第一次被PATTERN2匹配到的行结束。
6.'$SHELL'使用shell变量的话用''引起来。
7.; 多命令用;隔开
[COMMAND]
p:打印。显示符合条件的行。
a \ STRING:
在匹配到行后追加新行,内容为STRING,STRING中有空格要用''引起来
追加多行使用\n换行来实现。
i \ STRING:
在匹配到行前追加新行,内容为STRING。
插入多行和a \ 相同,也使用时\n换行来实现。
c \ :替换某个符合条件的行。
r FILE:
从FILE中读文件内容并追加到符合条件的行处。
w FILE:
将指定范围内的内容另存为至指定的文件FILE中。
y:
y/OLD/NEW/ 逐个字符对应替换,将OLD中的内容依次替换成NEW中的内容。
d:删除符合条件的行。
s:查找并替换,默认只替换每行中第一次被模式匹配到的字符串。
s/OLDSTR/NEWSTR/FLAG
OLDSTR 支持正则表达式。
NEWSTR 不支持正则表达式
&:表示OLD里边的内容。
\U:把\U后边的字符全部转为大写。
\u:把\u后边的第一个字符变成大写。
\L:把\L后边的字符全部转为小写。
\l:把\l后边的低格字符变成小写。
\E:终止
FLAG
g 全局替换。
i 查找时忽略大小写。
p 打印符合条件内容到屏幕上。
后向引用:
\(\),\1,\2...
&:引用模式匹配整个串。
!;取反。这个写在[COMMAND]之前。
= 显示当前行的行号
例如:
#sed '1,2d' /etc/fstab 不显示/etc/fstab中的1和2行。
#sed '3,$d' /etc/fstab 只显示/etc/fstab的1和2行。
#sed '/oot/d' /etc/fstab 不显示包含oot的行。
#sed '1,+2d' /etc/fstab 不显示前三行。
#sed '1d' /etc/fstab 不显示第一行。
#sed '/^\//d' /etc/fstab 不显示以斜线开头的行。
#sed -n '/^\//p' /etc/fstab 显示以斜线开头的行。
#sed '/^\//a \#hello world\n#hello linux' /etc/fstab 显示以斜线开头的行,并在后边加上#hello world换行后添加#hello linux。
#sed '2r /etc/issue' /etc/fstab 将/etc/issue的内容添加到/etc/fstab文件的第二行后。
#sed '1,2r /etc/issue' /etc/fstab 将/etc/issue的内容添加到/etc/fstab文件的第一行和第二行后。
#sed -n '/^oot/w /tmp/oot.txt' /etc/fstab 将/etc/fstab中以oot开头的行,另存到/tmp/oot.txt这个文件中。
#sed -n 's/oot/Oot/' /etc/fstab 将/etc/fstab中oot替换为Oot
sed -n 's/^\//#/' /etc/fstab 将/etc/fstab中以斜线开头行中的斜线替换为#。
sed -n 's@^/@#@' /etc/fstab 将/etc/fstab中以斜线开头行中的斜线替换为#。
sed -n 's/l..e/&r/g' /tmp/sed.txt 将/tmp/sed.txt中符合l..e的内容全部替换为l..er。
sed -n 's#\(l..e\)#\1r#g' /tmp/sed.txt 将/tmp/sed.txt中符合l..e的内容全部替换为l..er。
sed -n 's#^l\(..e\)#L\1r#g' /tmp/sed.txt 将/tmp/sed.txt中符合l..e的内容全部替换为L..er。
#sed 's/\[.*\]/\U&/g' /etc/samba/smb.conf 将smb.conf中的[]内的小写转为大写字符。
#history | sed 's/^[[:space:]]*//g' 删除history中开头的空白字符。
练习:
1.删除/etc/grub.conf文件中行首的空白符
sed -r 's#^[[:space:]]+##g' /etc/grub.conf
2.替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5
sed 's#\(id:\)[0-9]\(:initdefault\)#\15\2#g' /etc/inittab
3.删除/etc/inittab文件中的空白行
sed '^$d' /etc/inttab
4.删除/etc/inittab文件中开头的#号
sed 's@^#@@' /etc/inittab
5.删除某文件中开头的#号及后边的空白字符,但要求#后边必须有空白字符
sed -r 's@^#[[:space:]]+@@g' test.txt
6.删除某文件中以空白字符后边跟#类的行开头的空白字符以及#
sed -r 's@^[[:space:]]+#@@g' test.txt
7.取出一个文件路径的目录名称
echo "/etc/inittab"|sed -r 's@^(/.*/)[^/]+?/@\1@g'
8.取出一个文件路径的基名
echo "/etc/inittab"|sed -r 's@/.*/([^/]+?)/@\1@g'