sed 基本用法
sed : Stream EDitor 行编辑器 (全屏编辑器: vim)
sed: 默认打印模式空间 默认不编辑原文件,仅对模式空间中的数据做处理; 而后,处理结束后,将模式空间打印至屏幕
sed [optiones] 'ADDressCommand' file ...
-n : 静默模式 不在默认显示模式空间中的内容
-i : 直接修改原文件
-e SECRIPT -e SECRIPT : 可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT : 添加 "脚本文件" 到程序的运行列表
sed -f /path/to/scripts file
-r : 使用扩展正则表达式 ( 默认支持基本正则表达式 )
ADDress 地址表示
1 . StratLine , EndLine 比如 : 1 , 100
$ 最后一行
$-1 倒数第二行
2 . /RegExp/ 比如 : /^root/
3 . /pattern1/ , /pattern2/ 比如 : 第一次被 pattern1 匹配到的行开始, 至第一次被 pattern2 匹配到的行结束,这中间的所有行
4 . LineNumber 指定的行
5 . StartLine, +N 从 StartLine 开始, 向后的 N 行
Command:
d : 删除符合条件的行
1
2
3
4
5
|
[root@nono ~]
# sed '5,$d' /etc/fstab #删除 /etc/fstab 文件中的第五行到最后一行
[root@nono ~]
# sed '/oot/d' /etc/fstab #删除 /etc/fstab 文件中所有包含 oot 的行
[root@nono ~]
# sed '1,+2d' /etc/fstab #删除 /etc/fstab 文件中,第一行开始并向后两行的内容(3行)
[root@nono ~]
# sed '1d' /etc/fstab #只删除第一行
[root@nono ~]
# sed '/^\//d' /etc/fstab #删除以 / 开头的行, ^\/ '\'为转译(使用字符本身的意义)
|
p : 显示符合条件的行
1
|
[root@nono ~]
# sed -n '/^\//p' /etc/fstab #只显示以 '\' 开头的行 -n:不显示模式空间中的内容
|
a \string : 在指定的行后面追加新行,内容为 "string"
1
2
|
[root@nono ~]
# sed '/^\//a \#hello word' /etc/fstab #在 / 开头的行下面,追加 /#hello word
[root@nono ~]
# sed '/^\//a \#hello word\n\#hello linux' /etc/fstab #追加两行 \n : 换行符
|
i \string : 在指定的行前面追加新行,内容为 "string" 用法与 a \string 相同
r FILE : 将指定的文件的内容添加至符合条件的行处
1
2
|
[root@nono ~]
# sed '2r /etc/issue' /etc/fstab #在 /etc/fstab 的第二行后面,添加文件 /etc/issue 的内容
[root@nono ~]
# sed '1,2r /etc/issue' /etc/fstab #在 /etc/fstab 的第一行,第二行后面分别添加 /etc/issue 的内容
|
w FILE : 将地址指定的范围内的行另存至指定的文件中
1
|
[root@nono ~]
# sed '/oot/w /tmp/oot.txt' /etc/fstab #将 /etc/fstab 文件中包含 oot 的行,保存至 /tmp/oot.txt 文件中
|
s /pattern/string/修饰符 : 表示查找并替换 (默认只替换每行中第一次被模式匹配到的字符串)
pattern : 可以使用正则表达式的元字符
修饰符
g : 全局替换
i : 查找时忽略字符大小写
s/// : s### : s@@@ 作用相同
1
2
|
[root@nono ~]
# sed 's@/@#@g' /etc/fstab #将 /etc/fstab 文件中的 / 替换为 # (g 全局替换)
[root@nono ~]
# history | sed 's#^[[:space:]]*##' #将 history 行首的空格删除 (可以删除多个空白字符)
|
练习
删除 /etc/grub.conf 文件中行首的空白符
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf
删除 /etc/inittab 文件中的空白行
sed '/^$/d' /etc/inittab
删除 /etc/inittab 文件中开头的 # 号
sed 's@^#@@g' /etc/inittab
删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
删除某文件中以空白字符后面跟 # 类的行中的开头的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
取出一个文件路径的目录名称
echo "/etc/rc.d/" | sed 's@^(/.*/)[^/]+/?@\1@g'
本文转自 mlwzby 51CTO博客,原文链接:http://blog.51cto.com/aby028/1825600