二十一 sed命令

sed替换命令讲解

1 sed 的模式空间

sed的基本工作方式是:
 - 将文件以行为单位读取到内存(模式空间)
 - 使用sed的每个脚本对该行进行操作
 - 处理完成后输出改行

2 sed替换命令

sed的替换命令s:
 - sed 's/old/new/' filename
 - sed -e 's/old/new/' -e 's/old/new/' filename ...
 - sed -i 's/old/new/' 's/old/new/' filename ...

带正则表达式的替换命令s:
 - sed 's /正则表达式/new' filename
 - sed -r 's /扩展正则表达式/new' filename

(1) 将a字符替换为bb,可以发现只有第一个a替换为bb了,这是sed命令的程序控制的。替换后不会影响原文件

--- ~/shell_practice » echo a a a > test.txt
--- ~/shell_practice » cat test.txt                                        
a a a
--- ~/shell_practice » sed 's/a/bb/' test.txt
bb a a
--- ~/shell_practice » cat test.txt
a a a

(2) 多次替换,可以使用一下两种方法:

--- ~/shell_practice » sed -e 's/a/bb/' -e 's/bb/cc/' test.txt              1 ↵
cc a a
--- ~/shell_practice » sed 's/a/bb/;s/bb/cc/' test.txt
cc a a

(3) 多个文件的替换

--- ~/shell_practice » cat test.txt
a a a
--- ~/shell_practice » cat test1.txt
a a a
--- ~/shell_practice » sed 's/a/bb/;s/bb/cc/' test.txt test1.txt
cc a a
cc a a

(4) 将替换结果写入到原文件

--- ~/shell_practice » sed -i '' 's/a/bb/' test.txt
--- ~/shell_practice » cat test.txt
bb a a

(5) 正则表达式

--- ~/shell_practice » cat test.txt                                         1 ↵
Hello marry!
hello mike!
hello xie!
hello marry!
# 删除前面三个字符
--- ~/shell_practice » sed 's/...//' test.txt
lo marry!
lo mike!
lo xie!
lo marry!
# 将开头的H替换为a
--- ~/shell_practice » sed 's/^H/a/' test.txt
aello marry!
hello mike!
hello xie!
hello marry!
# 
--- ~/shell_practice » sed 's/H*e/a/' test.txt
allo marry!
hallo mike!
hallo xie!
hallo marry!
# 这里的*是指元字符,匹配0个或多个前面的字符
--- ~/shell_practice » cat bfile
b
a
aa
aaa
ab
abb
abbb
--- ~/shell_practice » sed 's/ab*/!/' bfile
b
!
!a
!aa
!
!
!

(6) 扩展元字符

# 扩展元字符+,表示匹配前面出现过1次或多次
--- ~/shell_practice » sed -r 's/ab+/!/' bfile
b
a
aa
aaa
aa
!
!
# 扩展元字符?,表示匹配前面出现0次或1次
--- ~/shell_practice »sed -r 's/ab?/!/' bfile
b
!
!a
!aa
!a
!b
!bb
# 扩展元字符|,表示匹配前面任一个字符
--- ~/shell_practice » sed -r 's/a|b/!/' bfile
!
!
!a
!aa
!a
!bb
!bbb
# 如果要匹配多个字符,要加个括号()分组
--- ~/shell_practice » sed -r 's/(aa)|(bb)/!/' bfile
b
a
!
!a
!
a!
a!b
# ()还可以实现回调,待补充

sed替换指令加强版

  • 全局替换
  • 标志位
  • 寻址
  • 分组
  • sed脚本文件

(1) 全局替换
以passwd文件为例子

--- ~/shell_practice » head -2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
# 全局替换,在替换命令后面加个g
--- ~/shell_practice » head -2 /etc/passwd | sed 's/root/!/g'
!:x:0:0:!:/!:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

(2) 标志位

s/old/new/标志位

  • 数字,第几次出现才替换
  • g,每次出现都进行替换
  • p 打印模式空间的内容
     sed -n script' filename 阻止默认输出
  • w file 将模式空间的内容写入到文件
# 只替换第一个匹配的位置,默认情况也是指替换第一个匹配位置
--- ~/shell_practice » head -2 /etc/passwd | sed 's/root/!/1'
!:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
# 替换第二个匹配位置
--- ~/shell_practice » head -2 /etc/passwd | sed 's/root/!/2'
root:x:0:0:!:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
# 只输出替换的行
--- ~/shell_practice » head -2 /etc/passwd | sed -n 's/root/!/p'
!:x:0:0:root:/root:/bin/bash
# 将模式空间的内容写入到文件
--- ~/shell_practice » head -2 /etc/passwd | sed -n 's/root/!/w cfile'
--- ~/shell_practice » cat cfile
!:x:0:0:root:/root:/bin/bash

(3) 寻址

默认对每行进行操作,增加寻址后对匹配的行进行操作

  • /正则表达式/s/old/new/g
  • 行号s/old/new/g
     行号可以是具体的行,也可以是最后一行$符号
  • 可以使用两个寻址符号,也可以混合使用行号和正则地址
# 指定行号替换:第三行的匹配项才进行替换
--- ~/shell_practice » head -3 /etc/passwd | sed '3s/usr/!/'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/!/sbin/nologin
# 指定行号替换:第三四行的匹配项才进行替换
--- ~/shell_practice » head -4 /etc/passwd | sed '3,4s/usr/!/'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/!/sbin/nologin
sys:x:3:3:sys:/dev:/!/sbin/nologin
# 按照正则表达式替换: 
--- ~/shell_practice » head -4 /etc/passwd | sed '/^daemon/s/usr/!/'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/!/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
# 指定行号和正则来替换:以daemon开头这一行开始到最后一行
head -4 /etc/passwd | sed '/^daemon/,$s/usr/!/'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/!/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/!/sbin/nologin
sys:x:3:3:sys:/dev:/!/sbin/nologin

(4) 分组

寻址可以匹配多条命令
/regular/ { s/old/new/ ; s/old/new/ }

(5) 脚本文件

可以将选项保存为文件,使用-f加载脚本文件
sed -f sedscript filename

sed的其他命令

  • 删除命令
  • 追加、插入、更改
  • 打印
  • 下一行
  • 读文件和写文件
  • 退出命令

sed的多行模式

为什么要有多行模式
 配置文件一般是单行出现,但是也有使用xml和json格式的配置文件,为多行出现
多行模式处理命令N、D、P

sed的保持空间

(待补充)

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