linux中的sed 命令

sed的基本语法
sed [-hnV][-e’script’][-f script文件][文本文件]

参数说明:

-h或–help 显示帮助; -n或- -quiet或–silent 仅显示script处理后的结果; -V或- -version 显示版本信息。
-e ‘script’]或- -expression=’script’ 以选项中指定的script来处理输入的文本文件。-e可以省略,用’’标注script就可以了.
-f script文件或- -file=script文件 以选项中指定的script文件来处理输入的文本文件。-f也可以省略, 直接给出文件名称就可以.
但是! 用sed选项-e将改动直接修改到源文件是非常危险的, 可以采用重定向的方式保存sed的输出,例如:

sed ‘some-sed-commands’ input_file>output_file

这里主要说说sed 的替换功能.

sed替换指定文字
sed命令配合正则表达式可以替换指定文本,基本的script格式为:

sed ‘s/要被取代的字串/新的字串/g’

这里s表示替换命令, 命令末端的g表示在行内进行全局替换. //符号称为delimiter, sed命令支持的delimiter有很多,除了常见的//以外, 还有@, _, #, 甚至空格都是sed命令支持的delimiter. 丰富的delimiter支持可以让正则表达式script更好读

例如: 如果datafile中有多个My开头的文字,所有开头的My都被替换为You。

sed ‘s/^My/You/g’ datafile

例如: 取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上。

sed -n ‘1,20s/My$/You/gp’ datafile

再举一个比较难的例子:取出一个文件路径的目录名称;

echo “/etc/rc.d/abc/edu/” | sed -r ‘s@^(/.*/)[^/]+/?@\1@g’

因sed支持扩展正则表达式,在扩展正则表达式中,+表示匹配其前面的字符至少1次. () 为子表达式, []为字符列表. 这里的delimiter符号是@. 对script每个部分详细展开:
s@^ 这里的^表示指定开头符号;
[^/]+/则是在匹配的字符中匹配 “非/符号和/构成的字段”.
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
@\1@g 语句的最后部分代表将s@…@中间正则表达式(/.*/)[/]+/?得到的匹配字符串全部替换为倒数第1个 “非/符号和/构成的字段”.

取出一个文件路径的最后一个文件名;

echo “/etc/rc.d/abc/edu/” | sed -r ‘s@^ /.*/([^/]+)/?@\1@g’

更多例子,值得仔细理解:
1、删除/etc/grub.conf文件中行首的空白符;
sed -r ‘s/^[[:space:]]+//’ /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/inittab
4、删除/etc/inittab文件中开头的#号;
sed ‘s/^#//g’ /etc/inittab
5、删除某文件中开头的#号及其后面的空白字符,但要求#号后面必须有空白符;
sed ‘s/^#[[:space:]]{1,}//g’ /etc/inittab 或者
sed -r ‘s/^#[[:space:]]+//g’ /etc/inittab
6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
sed -r ‘s/^[[:space:]]+#//g’ /etc/inittab

你可能感兴趣的:(linux,基础)