sed用法详解

语法:

sed [options] 'command' in_file[s]

options 部分:
-n 静默输出(不打印默认输出)

-e 给予sed多个命令的时候需要-e选项

sed -e 's/root/haha/g' -e 's/bash/wwwww/g' passwd > passwd.bak

如果不用-e选项也可以用分号“;”把多个命令隔开。

sed 's/haha/ro/g ; s/wwwww/kkkk/g' passwd | less

-i -i后面没有扩展名的话直接修改文件,如果有扩展名备份源文件,产生以扩展名结尾的新文件

sed -iback1 -e 's/root/rottt/g' -e 's/bash/wwwww/g' passwd.back //选项-i后面没有空格

[root@localhost 桌面]# ls
manifest.txt passwdback1

-f 当有多个要编辑的项目时,可以将编辑命令放进一个脚本里,再使用sed搭配-f选项
[root@localhost 桌面]# cat s.sed
s/bin/a/g
s/ftp/b/g
s/mail/c/g
[root@localhost 桌面]# sed -f s.sed passwd | less

command 部分:

‘[地址1,地址2] [函数] [参数(标记)]'

定址: /[0-9]+/ 以它为 地址标准的才能执行后边awk内容或sed内容
行地址对于任何命令都是可选的,它可以是一个模式,或者由斜杠、行号或行寻址符号括住的正则表达式, 大多数sed命令能接受由逗号分隔的两个地址,有些命令只接受单个行地址

命令还可以用大括号进行分组,第一个命令可以和大括号放在同一行,但是右大括号必须自己一行

定址的方法 1.数字 2.正则
数字(行号):十进制数
1 单行
#sed -n '1p' passwd p是打印函数

    1,3 范围 从第一行到第三行      
        #sed -n '1,3p' passwd
    
     2,+4   匹配行后若干行         
    
     4,~3  从第四行到下一个3的倍数行
    
     1~3    第一行起每间隔三行的行
    
     $  尾行
    
     1! 除了第一行以外的行

正则:
   正则必须用//包裹起来
   扩展正则需要用 -r 参数或转移

范例:

cat file.txt

.TS
Beijing,CN
.TE
Shanghai,CN
guangzhou,CN
shenyang,CN

sed ‘/Beijing/s/CN/China/' file.txt

删除所有的行

d

只删除第一行

1d

使用寻址符号$,删除最后一行

$d

删除空行,正则表达式必须封闭在斜杠//当中

/^$/d

删除.TS 和.TE 标记的tbl 输入

/.TS/,/.TE/d

删除第五行到结尾所有的行

5,$d

混合使用行地址和模式地址

sed ‘1,/^$/d' file.txt

删除除了那些行以外的行

1,5!d

============================================================

分组命令

/.TS/,/.TE/{
s/CN/China/
s/Beijing/BJ/
}
sed '2,3s{/cn/china/;s/a/b/}' file.txt 同一范围的两个替换可以用大括号括起来一起,中间加分号
============================================================

函数:

增删改:
  a 后插
  c 替换
  i 前插

d删除模式空间的所有内容,并接着读入下一行到模式空间

替换:[address ]s/pattern /replacement /flags

标志flags是:
    n 可以是1-512,表示第n次出现的情况进行替换
    g 全局更改
    p 打印模式空间的内容
    w file 写入到一个文件file中
    i  忽略大小写
        [root@wing ~]# echo Aaaaba | sed -r 's/a.*/B/'
        AB
        [root@wing ~]# echo Aaaaba | sed -r 's/a.*/B/i'
        B

  s 字符串替换 s/old/new/

替换的时候可以把/换成其他的符号,比如=

     #sed -n 's/root/ABCDEF/p' /etc/passwd
     ABCDEF:x:0:0:root:/root:/bin/bash

replacement部分用下列字符会有特殊含义:

    & 用正则表达式匹配的内容进行替换
    \n 回调参数
    \(\)保存被匹配的字符以备反向引用\N时使用,最多9个标签 标签顺序从左至右

    #cat test1
    first:second
    one:two
    #sed ‘s/\(.*\):\(.*\)/\2:\1/' test1
    second:first
    two:one

y 字符替换(变形) y是替换整个字符串 s也可以但是s是一个一个匹配的
r 从文件中读入内容到指定行的后面
#sed‘2r b.txt’ a.txt 将b.txt文件内容读入到文件a.txt的第2行后面
=====================================================================

工作模式:模式空间和保持空间介绍

模式空间:初始化为空,处理完一行后会自动输出到屏幕并清除模式空间。
             :  将符合内容进行更改 将更改的内容作为下一个的要更改的内容
            : 将第一行处理完后 将处理过的内容 打印出来,将模式空间清楚 换第二行来处理

置换:模式空间和保持空间(暂存空间)

  h 把模式空间内容覆盖到保持空间中
  H 把模式空间内容追加到保持空间中
  g 把保持空间内容覆盖到模式空间中
  G 把保持空间内容追加到模式空间中
  x 交换模式空间与保持空间的内容
d删除模式空间的所有内容,并接着读入下一行到模式空间
颠倒输出    直接用tac 就可以颠倒
$ sed '1!G;h;$!d' rev.txt
xyz
def
abc
$
详解
1!G;h;$!d
文本  
1
2
3
              模式空间           保持空间
第一行     1                              1   后边将覆盖
第二行      2                           2     后边将覆盖
                1                            1
第三行       3                          3 
                 2                            2
                 1                            1

cat passwd |tac

:wq
1
1
1
1
1
o
xiaomi:x:1000:1000:xiaomi:/home/xiaomi:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
emon:x:2:2:daemon:/sbin:/sbin/nologin

# cat test.sh 
1111111
2222222 
3333333
4444444
# sed  '{1h;2,3H;4G}'  ./test.sh 
1111111
2222222
3333333
4444444
1111111
2222222
3333333
# sed  '{1h;2x;3g;$G}'  ./test.sh 
1111111
1111111
2222222
4444444
2222222
保持空间:相当于粘贴板  里边内容不会主动被清空
保持空间:初始化为一个空行,也就是默认带一个\n,处理完后不会自动清除。

控制流

  !  命令取反 例: 1!d 删除第一行以外的行
  {} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法
  =  打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile
  n  读入下一行到模式空间 例:'4{n;d}' 删除第5行
  N  而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令
      P  输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出。
      P命令经常出现在N命令之后和D命令之前。
  D  删除模式空间中直到第一个换行符的内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用与模式空间剩余的内容。

  这三个命令能建立一个输入、输出循环,用来维护两行模式空间,但是一次只输出一行。
  这个循环的目的是只输出模式空间的第一行,然后返回到脚本的顶端将所有的命令应用于模式空间的第二行。没有这个循环,当执行脚本中的最后一个命令时,模式空间中的这两行都将被输出。
  # tac  将文本内容倒过来
  # cat a.txt |tac
   删除文件倒数第二行
   #sed 'N;$!P;D' a.txt
    N将下一行追加到模式空间中 现在模式空间中会有 第一行和第二行
    交给P来进行   P将 第一行输出 出来 
    交给D来进行  D将 第一行删除 然后重新执行子命令  然后在来一边
    这样循环如果只有N;P;D   内容将不会该变什么 因为他可以循环到底
    在p前边加$!  是为了取反 执行最后一行之外的行     N将最后一行和倒数第二行放里边了
    P执行时 不执行最后一行直接略过交给D执行  然后他把第一行删除掉  内容中的第二行就被删除了
    然后再循环一次   因为后边没有内容了 N不再执行 P将第一行输出  粘贴板没有内容了  D也不执行  
   
   
   删除文件最后两行
   sed 'N;$!P;$!D;$d' a.txt

练习:
将第一行插入到每个偶数行的后面

$ sed  '1h;0~2G' a.txt
11111111
22222222
11111111
33333333
44444444
11111111
55555555
66666666
11111111

脚本方法

 -f 参数 引用脚本(脚本的末尾不能有空格制表符或其他文本)
# cat sed.sh 
2,4d
s/777/seker/
s/999/seker&seker/
# sed -f sed.sh test.txt 
1111111
5555555
6666666
seker7777
8888888
seker999seker9999

在脚本中指明解释器为sed

# cat sed.sh 
#!/bin/sed -f
2,4d
s/777/seker/
s/999/seker&seker/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353