sed基本用法

linux系统管理 struggling 1084次浏览 0个评论
文章目录

一,sed基本格式

<code>sed是stream editor(流编辑器)的缩写。其最常用的用法就是文本替换。
sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理,显示以p指定的行。
-e :直接在指令列模式上进行sed 的动作编辑,当有多个编辑动作时,必须加上-e。
-f :直接将 sed 的动作写在一个档案内,-f filename则可以执行filename内的sed 动作
-r :sed的动作支持的是延伸型正规表示法的用法(预设是基础正规表示语法)
-i :直接修改读取的档案内容,而不是由屏幕输出

动作说明:[n1[,n2]]function
n1, n2 :在 10 到 20 行之间进行操作

function 有底下这些东东:
a :新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c :取代,c 的后面可以接字符串,这些字符串可以叏代 n1,n2之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入,i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作
s :取代,可以直接进行取代的工作,通常这个s的动作可以搭配正规表示法。例如:1,20s/old/new/g</code>

二,sed基本用法

<code>            #替换gay为boy,s表示替换

[root@localhost test]# echo  "he is a gay" | sed 's/gay/boy/'  
he is a boy

            #-i表示将替换后的文本保存到原文件

[root@localhost test]# cat a
he is a gay
[root@localhost test]# sed -i 's/gay/boy/' a                            
[root@localhost test]# cat a
he is a boy

          #sed默认将每一行第一处符合样式的内容替换,g表示替换每一处匹配到的文本

[root@localhost test]# sed 's/he/she/' a         
she is a boy,but he is a gay

[root@localhost test]# sed 's/he/she/g' a       
she is a boy,but she is a gay

         #ng表示从第n个符合的样式处开始替换,忽略前n个匹配到的样式.

[root@localhost test]# echo he he he he|sed 's/he/she/3g'
he he she she

/在sed中是一个定界符,我们也可以使用其他的定界符,有“@”,"|","#",“=”,";"(分号),“:”(冒号)

[root@localhost test]# echo he he he he|sed 's@he@she@4g'
he he he she
[root@localhost test]# echo he he he he|sed 's:he:she:4g'
he he he she
[root@localhost test]# echo he he he he|sed 's|he|she|4g'
he he he she

其他用法:

/d:表示删除 ,以下用法表示删除空白行

[root@localhost test]# echo -e "asd\n\nqwe\n\n123" | sed '/^$/d'
asd
qwe
123
[root@sta ~]# sed 1,10d  /etc/fstab   #删除1-10行


在sed中,&表示匹配到的样式的字符串,\w\+匹配每一个单词,一下将匹配到的字符串用[]括起

[root@localhost test]# echo "he is a gay! " |sed 's/\w\+/[&]/g'
[he] [is] [a] [gay]!

          #\n:子串匹配标记 ,\0表示原字符串,\(和\)用于保存正则表达式的一部分,\1和\2用于回调保存的部分

[root@localhost test]# echo "is GAY" | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
GAY is
[root@localhost test]# echo "is GAY" | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \0/'
GAY is GAY
[root@localhost test]# echo "is GAY" | sed 's/\([a-z]\+\) \([A-Z]\+\)/\0 \1/'
is GAY is

           #sed的-e,-n  选项用法,一般两个会连用,再以-p输出指定的行

[root@localhost ~]# sed -n -e 's/root/linux/g'  -e  1,3p /etc/passwd
linux:x:0:0:linux:/linux:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

          #sed表达式通常使用单引号来引用,但如果使用表达式时则可以使用“”其求值来对其进行扩展输出

[root@localhost test]# a=hi
[root@localhost test]# echo hello  hi|sed "s/$a/hello/"
hello hello
          #使用nq打印文件的n行
[root@localhost ~]# sed 3q  /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

sed与其他命令结合使用:

[root@localhost test]# pwd
/tmp/test
[root@localhost test]# ls
a  b  c  d
[root@localhost test]# find /tmp/test/ -type d -print|sed 's;/tmp/test/;/tmp/test1/;'|sed 's/^/mkdir /'|sh -x
+ mkdir /tmp/test1/
+ mkdir /tmp/test1/b
+ mkdir /tmp/test1/d
+ mkdir /tmp/test1/a
+ mkdir /tmp/test1/c

sed在文本查找时有可能会匹配到null字符串:

[root@localhost test]# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
。。。。。

[root@localhost test]# sed 's/:.*//g' /etc/passwd 
root
bin
daemon
adm
lp
。。。

[root@localhost test]# sed 's/:*//g' /etc/passwd 
rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin
admx34adm/var/adm/sbin/nologin
lpx47lp/var/spool/lpd/sbin/nologin
syncx50sync/sbin/bin/sync
。。。。。

</code>

三,关于 sed 的一些小练习


[root@localhost ~]# sed -n '/^#/,/^\//p' /etc/fstab     #打印第一次以#开头的行,和第一次以/开头的行
  
[root@localhost ~]# sed '/^[[:upper:]]/a \first line. \nsecond line.' /etc/fstab   #在以大写字母开头的行后面追加"second line."

[root@localhost ~]# sed '/^UUID/r /etc/issue' /etc/fstab   #在UUID开头的行后面插入 issue文件

[root@localhost ~]# sed '/^\//w /tmp/file'   /etc/fstab     #所有以/开头的行写入到文件/tmp/file中

[root@localhost ~]# sed '/^\//='   /etc/fstab   #显示匹配的行号 

 [root@localhost ~]# echo "he like his liker" |sed '/\(l..e\).*\1/ s/l\(..er\)/L\1/'   #查找替换 

 he like his Liker


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

# sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab

2、删除/etc/init.d/funcions文件中的空白行;

# sed '/^$/d' /etc/ini.t/functions

3、删除/etc/inittab文件中位于行首的#;

# sed 's@^#@@g' /etc/initta

4、删除/etc/rc.d/rc.sysinit文件中以#后跟至少一个空白字符开头的行的行首的#和空白字符;

# sed 's@^#[[:space:]]\{1,\}@@g' /etc/rc.d/rc.sysinit

5、删除/boot/grub/grub.conf文件中行首的空白字符;

# sed 's@^[[:space:]]\{1,\}@@' /boot/grub/grub.conf

6、取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令;

# echo /etc/sysconfig/network-scripts/ifcfg-eth0/ | sed 's@[^/]\{1,\}/\?$@@'



 


DevOps-田飞雨 》》转载请注明源地址
喜欢 (4)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址