首页 > 代码库 > sed 命令用法

sed 命令用法

关于sed的使用方法总结及实践

流编辑器

一次从文件中读出一行,放在自己的工作车间里,不会去改原来的文件内容,把pattern space之后的处理结果,输出到标准输出stdout

 

-n 使用安静模式,在一般的sed用法中,所有的stdin的数据都会输出到屏幕上,加上-n之后,只有经过sed特殊处理的哪一行才会输出到屏幕上

-e直接在命令模式上进行动作编辑

-f直接将sed的动作写进一个文件里

-r sed的动作支持扩展正则表达式

-i直接修改源文件内容   写脚本可能会用到

 

 

地址定界

d表示删除,删除模式空间内容

a表示在行首添加

i表示在行尾添加

p表示打印打印模式空间内容

c表示替换

w保存文本后边是保存的路径

catabc123

helloworld

\helloworld

[craft@AAEP7151shell]$ sed ‘1,2d‘ abc123

[craft@AAEP7151shell]$ cat abc123

helloworld

\helloworld

仍然能显示出abc123的内容,由于sed默认是不改变源文件的

-i只写修改源文件

 

 

[sroot@AAEP7151shell]# sed ‘/^d/d‘ abc123

 

a

b

c

hello

world

删除以d 开头的行 

 

[sroot@AAEP7151shell]# sed ‘1~2d‘ abc123

a

c

hello

 

以第一行开始,步进为2。表示所有奇数行。

匹配到奇数行之后,放进模式空间,再删除。

之后把模式空间和原来没匹配的内容都输出出来。

其实输出的是偶数行。

 

 sed -n ‘1~2d‘ abc123开启静默模式后,不输出没匹配到的了。

[sroot@AAEP7151shell]# sed -n ‘1~2p‘ abc123

 

b

d

world

p表示把模式空间内部的输出来。,由于是静默模式,其他没匹配的不输出。

 

[sroot@AAEP7151shell]# sed  ‘1~2p‘ abc123

 

 

a

b

b

c

d

d

hello

world

world

关掉静默模式,那些匹配到的内容,会输出两次,重复。

 

[sroot@AAEP7151shell]# sed ‘/^hello/a\#add new line‘ abc123

 

a

b

c

d

hello

#add new line

World

修改某些符合条件的内容

[sroot@AAEP7151shell]# sed ‘/^hello/c \#change new line‘ abc123

 

a

b

c

d

#changenew line

World

 

 

sed ‘/^[^#]/w /home/craft/shell/new‘ abc123      ^[^#]    和!^#一样

 

[sroot@AAEP7151shell]# cat new

a

b

c

d

hello

World

编辑命令:

d:删除;

p:显示模式空间中的内容;

a \text:在行后面追加文本“text”,支持使用\n实现多行追加;

i \text:在行前面插入文本“text”,支持使用\n实现多行插入;

c \text:把匹配到的行替换为此处指定的文本“text”;

w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;

r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;

=:为模式匹配到的行打印行号;

!:条件取反;

地址定界!编辑命令;

s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;

替换标记:

g:全局替换

w/PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;

p:显示替换成功的行;

 

s查找替换

 g全局替换

w替换的结果保存到某文件中

p显示替换成功的行

 

练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;

~]# sed  ‘s@^[[:space:]]\+@@‘ /etc/grub2.cfg +表示多个空白

@要替换内容@替换内容@    两个@@表示,用空替换也就是删除

练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;

~]#sed  ‘s@^#[[:space:]]*@@‘  /etc/fstab

练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;

~]# echo "/var/log/messages/" | sed ‘s@[^/]\+/\?$@@‘  []表示行尾  从行尾开始找,非斜线的替换为空

~]# echo"/var/log/messages" | sed -r ‘s@[^/]+/?$@@‘

 

 

 

 


sed 命令用法