sed(流编辑器,行编辑器)
是一种流编辑器,一次处理一行内容,处理时把当前处理的行存储在临时缓存中,成为“模式空间”,接着用sed命令处理缓冲区的内容,处理完毕后吧缓冲区内容输出到屏幕接着处理下一行。这样不断重复到末尾。文件内容并没有改变。除非使用重定向输出才会改变内容。
sed:行编辑器(全屏编辑器:vi)
\\把制定行提取到内存中编辑,编辑完成后,显示在屏幕上。
sed:模式空间
##默认不编辑源文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕。
用法:
sed [option]… 'script' inputfile…
常用选项:
-n:不输出模式空间内容的自动打印
-e: 多点编辑
-f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i: 原处编辑
script:
'地址命令'
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
编辑命令:
d: 删除模式空间匹配的行 p: 显示模式空间中的内容 a \text:在行后面追加文本;支持使用\n实现多行追加 i \text:在行前面插入文本;支持使用\n实现多行插入 c \text:替换行为单行或多行文本 w /path/to/somefile: 保存模式匹配的行至指定文件 r /path/from/somefile:读取指定文件的文本至模式空 # sed -i.bak '/^U/r /etc/issue' f3 //-i.bak表示把f3这个文件备份,然后在把/etc/issue这个文件读入f3间中匹配到的行后 =: 为模式空间中的行打印行号 # sed '/^UUID/p' /testdir/f3 !:模式空间中匹配行取反处理 v # sed '/^UUID/!d' /testdir/f3 == # sed -n '/UUID/p' /testdir/f3 s///:查找替换,支持使用其它分隔符, s@@@, s### 替换标记: g: 行内全局替换 p: 显示替换成功的行 w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中 |
例子// sed ‘2p’ /etc/passwd
sed –n ‘2p’ /etc/passwd
sed –n ‘1,4p’ /etc/passwd
sed –n ‘/root/p’ /etc/passwd
sed –n ‘2,/root/p’ /etc/passwd 从2行开始
sed -n ‘/^$/=’ file 显示空行行号
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
sed ‘/root/a\superman’ /etc/passwd行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
高级编辑命令:
h: 把模式空间中的内容覆盖至保持空间中 H:把模式空间中的内容追加至保持空间中 g: 从保持空间取出数据覆盖至模式空间 G:从保持空间取出内容追加至模式空间 x: 把模式空间中的内容与保持空间中的内容进行互换 n: 读取匹配到的行的下一行覆盖至模式空间 N:追加匹配到的行的下一行至模式空间 d: 删除模式空间中的行 D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed |
sed -n 'n;p' FILE
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n‘s/root/&superman/p’ /etc/passwd 单词后
sed –n‘s/root/superman&/p’ /etc/passwd 单词前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets
sed '1!G;h;$!d' FILE
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE
sed -n '1!G;h;$p' FILE
语法
# sed [options] 'AddressCommand' file …
"options:
-n:不显示模式空间中的行
-i:直接修改源文件
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT:
# sed -f /path/to/sed_script
-r:表示使用扩展正则表达式
"Address:
1、StartLine,EndLine
比如1,100行
$:最后一行
2、/RegExp/
/^root/
3、/pattern1/,/pattern2/
\\第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行。
4、LineNumber
\\指定的行,精确某行。
5、StartLine,+N
\\从startLine开始,向后的N行;。
"Command:
d:删除符合条件的行
# sed '1,2d' /etc/fstab
p:显示符合条件的行
a \string:在指定的行后面追加新行,内容为string
\\'\n':可以换行。
i \string:在指定的行前面追加新行,内容为string
r FILE:将指定范围内的内容添加至符合条件的行处
w FILE:将指定范围内的内容另存至指定的文件中
s/pattern/string/修饰符:查找并替换,默认至替换每行中第一次被模式匹配到的字符串
加修饰符
g:全局替换
i:忽略字符大小写
s///:s@@@,s%%%,s###
&:引用模式匹配整个串
# sed 's#l..e#&r#g' sed.txt \\表示在匹配到的字符串中加入指定内容。
# sed 's#\(l..e\)#\1r#g' sed.txt \\同上。
sed练习:
1、删除/etc/grub.conf文件中行首的空白符;
# sed 's#^[[:space:]]##g' /etc/grub.conf
2、删除/etc/inittab文件中的空白行;
# sed '/^$/d' /etc/inittab
3、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;
# sed 's@\(id:\)[0-9](\:initdefault:\)@\15@\2g' /etc/inittab
4、删除/etc/inittab文件中开头的#号;
# sed 's@^#@@g' /etc/inittab
5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;
# sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#;
# sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取一个文件路径的目录名称
# echo "/etc/rc.d" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
保留文件的基明
# echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'
原创文章,作者:皱 多利亚,如若转载,请注明出处:http://www.178linux.com/34290