sed

sed基本用法:

sed: Stream EDitor

行编辑器 (全屏编辑器: vi)

sed: 模式空间

默认不编辑原文件,仅对模式空间中的数据做处理;而后,处理结束后,将模式空间打印至屏幕;读完一行编辑后输出一行。

Sed:用法

sed [options] ‘AddressCommand’ file …

    -n: 静默模式,不再默认显示模式空间中的内容(–quiet –silent)

[root@linux ~]# sed ‘/\//p’ /etc/fstab

[root@linux ~]# sed ‘/\//p’ /etc/fstab –n

    -i: 直接修改原文件

    -e SCRIPT -e SCRIPT:可以同时执行多个脚本

多次’AddressCommand’

    -f /PATH/TO/SED_SCRIPT

sed -f /path/to/scripts file

    -r: 表示使用扩展正则表达式

Address:

  1. 不给地址:对全文处理。

  2. 单地址:

#指定的行:

[root@linux ~]# sed ‘1d’ /etc/fstab

/parttern/;被此处模式匹配到的行

/^root/ 正则表达式 /RegExp/ === /Pattern/

[root@linux ~]# sed ‘/oot/d’ /etc/fstab

  1. StartLine,EndLine 起始行

比如1,100

$:最后一行

[root@linux ~]# sed ‘1,2d’ /etc/fstab

/pattern1/,/pattern2/ 正则表达式

第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行

[root@linux ~]# sed ‘/\/var\>/,/\/usr\>/d’ /etc/fstab

StartLine, +N

从startLine开始,向后的N行;

[root@linux ~]# sed ‘1,+2d’ /etc/fstab

  1. ~:步进

1~2

2~2

[root@localhost tmp]# sed ‘1~2p’ text.txt –n

Command:

    d: 删除符合条件的行;

[root@linux ~]# sed ‘3,$d’ /etc/fstab

LABEL=/ / ext3 defaults 1 1

LABEL=/var /var ext3 defaults 1 2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[root@repo bin]# sed ‘/^UUID/d’ /etc/fstab

[root@repo bin]# sed ‘/^#/d’ /etc/fstab


[root@repo bin]# sed ‘/^$/d’ /etc/fstab


[root@repo bin]# sed ‘/^UUID/!d’ /etc/fstab 取反了


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    p: 显示符合条件的行;

要打印两次,空间中的要打印出来,原来的也会打印才出来,与n结合只现实匹配到的行了。


    a \string:

在指定的行后面追加新行,内容为string

[root@linux ~]# sed ‘/\/\<var\>/a \#helloword’ /etc/fstab

[root@repo bin]# sed ‘/^UUID/a \jiazi’ /etc/fstab


\n:可以用于换行

I与a一前一后,支持/n多行插入

[root@linux ~]# sed ‘/\/var\>/a /####hello world \n hello linux‘ /etc/fstab

    i \string:

在指定的行前面添加新行,内容为string

[root@linux ~]# sed ‘/\/var\>/i /####hello world \n hello linux’ /etc/fstab

I与a一前一后,支持/n多行插入

[root@repo bin]# sed ‘/^UUID/a \jiazi’ /etc/fstab


[root@repo bin]# sed ‘/^UUID/i \jiazi’ /etc/fstab

c\string

[root@repo bin]# sed ‘/^UUID/c \jiazi’ /etc/fstab


UUID被替换为了jiazi

    r FILE:

将指定的文件的内容添加至符合条件的行处

[root@linux ~]# sed ‘/\/var\>/r /etc/issue’ /etc/fstab

[root@linux ~]# sed ‘/\/var\>/,/\/dev\/shm\>/r /etc/issue’ /etc/fstab

    w FILE:

将地址指定的范围内的行另存至指定的文件中;

把/etc/fstab中从/var到 /dev段保存到/home/issue中。

[root@linux ~]# sed ‘/\/var\>/,/\/dev\/shm\>/w /home/issue’ /etc/fstab

把/etc/fstab中UUID开头的行写入到文件/tmp/fstab.txt中。

[root@repo bin]# sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab


    s/pattern/string/修饰符:

查找并替换,默认只替换每行中第一次被模式匹配到的字符串

s///: s###, s@@@

\(\), \1, \2

[root@linux ~]# sed ‘s/oot\>/OOT/’ /etc/fstab

[root@repo bin]# sed ‘s@^UUID@uuid@’ /etc/fstab


/=打印行号

[root@repo bin]# sed ‘/^UUID/=’ /etc/fstab


        加修饰符

g: 全局替换

[root@linux ~]# sed ‘s/\//#/’ /etc/fstab

[root@linux ~]# sed ‘s/\//#/g’ /etc/fstab

i: 忽略字符大小写

l..e: like–>liker

love–>lover

like–>Like

love–>Love

&: 引用模式匹配整个串

[root@linux ~]# cat sed.txt

hello,like

hi, my love

[root@linux ~]# sed ‘s#l..e#&r#g’ sed.txt

\(\), \1, \2

[root@linux ~]# sed ‘s#\(l..e\)#\1r#g’ sed.txt

[root@linux ~]# sed ‘s#l\(..e\)#L\1#g’ sed.txt

删除history行首空白

[root@linux ~]# history | sed ‘s/^[[:space:]]\{1,\}//’

取出/etc/rc.d /var/log父目录

[root@repo bin]# sed ‘s@r..t@&er@’ /etc/passwd


高级编辑命令:

h: 把模式空间中的内容覆盖至保持空间中;

                    H:把模式空间中的内容追加至保持空间中;

g: 从保持空间取出数据覆盖至模式空间;

G:从保持空间取出内容追加至模式空间;

x: 把模式空间中的内容与保持空间中的内容进行互换;

n: 读取匹配到的行的下一行至模式空间;

N:追加匹配到的行的下一行至模式空间;

d: 删除模式空间中的行;

D:删除多行模式空间中的所有行;

sed -n ‘n;p’ FILE:显示偶数行

sed ‘1!G;h;$!d’ FILE:逆向显示文件内容

sed ‘$!N;$!D’ FILE: 取出文件后两行;

sed ‘$!d’ FILE:取出文件最后一行;

sed ‘G’ FILE:

sed ‘/^$/d;G’ FILE:

sed ‘n;d’ FILE: 显示奇数行;

sed -n ‘1!G;h;$p’ FILE: 逆向显示文件中的每一行;

sed练习:

1、删除/etc/grub.conf文件中行首的空白符;

<<<<<<<<<<<<<<<<<<<<<<<<<<<<有问题>>>>>>>>>>>>>>>>>>

sed -r ‘s@^[[:spapce:]]+@@g‘ /etc/grub.conf

<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

sed ‘s@^[[:space:]]\{1,\}@@’ /etc/grub.conf

sed ‘s/^[[:space:]]*//’ /etc/grub.conf

2、替换/etc/inittab文件中”id:3:initdefault:”一行中的数字为5;

sed ‘s@\(id:\)[0-9]\(:initdefault:\)@\15\2@g’ /etc/inittab

sed ‘s#\(^id\>:\)[[:digit:]]\(:\<initdefault\>:\)#\15\2#’ /etc/inittab

3、删除/etc/inittab文件中的空白行;

sed ‘/^$/d’ /etc/inittab

sed ‘/^$/d’ /etc/inittab

4、删除/etc/inittab文件中开头的#号;

sed ‘s@^#@@g’ /etc/inittab

5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;

sed -r ‘s@^#[[:space:]]+@@g’ /etc/inittab

sed -r ‘s@^#[[:space:]+]@@g’ /etc/inittab

6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#

sed -r ‘s@^[[:space:]]+#@@g’ /etc/inittab

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’

基名:

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

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

#abc

# hello world

# hi world

1、删除以#开头后面至少跟一个空白字符的行,删除#与空白字符。

[root@repo bin]# sed ‘s/^#[[:space:]]\{1,\}[^[:space:]]//’ /etc/fstab | sed ‘/^#/d’ /etc/fstab

2、echo 一个绝对路径取出其基名

倒着删除

[root@repo bin]# echo “/etc/sysconfig” | sed ‘s@[^/]\+/\?$@@’

取出其文件名

从前到后。

[root@repo bin]# echo “/etc/sysconfig/jkl/jfdkls/” | sed ‘s@^/.*/[^/]/\?@@’ | sed ‘s@/@@’

fdkls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值