sed - 5 Replace command

前篇回顾
sed - 简介 读取编辑文字档的好工具
sed - 2 Pattern
sed - 3 Delete command
sed - 4 Write commands

今天聊sed的修改或取代操作

  • s 取代指定匹配到的字串, 变成新字串

取代

基本格式

# 取代指定匹配到的字串, 变成新字串
sed 's/old/new/' filename
# 多组需要取代的pattern
sed -e 's/old/new/' -e 's/old/new/' filename

# 取代指定regex匹配到的字串, 变成新字串
sed 's/Regex/new' filename

# -r, 支持扩展Regexp, 取代指定regex匹配到的字串, 变成新字串
sed -r 's/Extended Regex/new' filename

重要

首先拿/etc/passwd来玩, 但是我们玩备份的这档案, 别玩etc底下的, 玩完系统就崩溃了

# 复制passwd 到当前目录
cp /etc/passwd ./

目标把passwd里面刚好前三个字母的字串给替换成AAA
https://ithelp.ithome.com.tw/upload/images/20210919/20104930ReEunwBZz4.png

head -5 passwd | sed 's/.../AAA/'      
> AAAt:x:0:0:root:/root:/bin/bash
> AAAmon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
> AAA:x:2:2:bin:/bin:/usr/sbin/nologin
> AAA:x:3:3:sys:/dev:/usr/sbin/nologin
> AAAc:x:4:65534:sync:/bin:/bin/sync

这里有点懒, 透过head工具取前5行, 透过管线传给sed,
...这里的三个点, 不是无言已对, .是regex的任意符号(什麽都匹配就是不匹配换行符号)
3个.就是三个任意符号, 但若是该行不足3个字元, 就不会被匹配到
拿之前的os.txt做示范, 可以看到最後一行只有OS两个字元, 就不会被匹配到

sed 's/...//' os.txt 
> dows OS	os
> ux Os os
> roid
> OS

其实取代也能是种删除, 把匹配到的给取代成空字串, 也是种删除
跟上面相比, 前三个字母就不见了, 因为被取代成空字串

head -5 passwd | sed 's/...//'   
> t:x:0:0:root:/root:/bin/bash
> mon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
> :x:2:2:bin:/bin:/usr/sbin/nologin
> :x:3:3:sys:/dev:/usr/sbin/nologin
> c:x:4:65534:sync:/bin:/bin/sync

来把sbin给取代成空字串看看, 这里用s*bin, *表示s可以出现任意次数

head -5 passwd | sed 's/s*bin//'
> root:x:0:0:root:/root://bash
> daemon:x:1:1:daemon:/usr/:/usr/sbin/nologin
> :x:2:2:bin:/bin:/usr/sbin/nologin
> sys:x:3:3:sys:/dev:/usr//nologin
> sync:x:4:65534:sync:/:/bin/sync

可以发现第2,3行, 後面还有sbin没被取代, 第5行还有一个bin
这是因为sed预设只匹配第一个
Regex使用g能做全域匹配, 这里sed是以行为单位, 所以这里的全域, 就是一整行都进行查找匹配.
後面的很多sbin/bin就都被取代了

head -5 passwd | sed 's/s*bin//g'
> root:x:0:0:root:/root://bash
> daemon:x:1:1:daemon:/usr/:/usr//nologin
> :x:2:2::/:/usr//nologin
> sys:x:3:3:sys:/dev:/usr//nologin
> sync:x:4:65534:sync:/://sync

当同一行匹配被匹配多次时, 指定第几次出现才进行替换; 记住默认是取代第一次匹配成功的
只针对同一行第2次匹配出现的进行取代

# 这里搭配-n不进行pattern space输出
# p, 只输出被匹配的, 这样画面乾净点
head -5 passwd | sed -n 's/root/!!!/2p'
> root:x:0:0:!!!:/root:/bin/bash

搭配之前的w把匹配的写到外部档案

head -5 passwd | sed -n 's/root/!!!/2pw /tmp/demo.txt'
> root:x:0:0:!!!:/root:/bin/bash

cat /tmp/demo.txt
> root:x:0:0:!!!:/root:/bin/bash

也能搭配之前的行定位

# 只针对1~3行做匹配
head -5 passwd | sed -n '1,3s/s*bin/!!!/p'
> root:x:0:0:root:/root:/!!!/bash
> daemon:x:1:1:daemon:/usr/!!!:/usr/sbin/nologin
> !!!:x:2:2:bin:/bin:/usr/sbin/nologin

sed的行定位, 其实不只能指定行号, 也能用Regex
针对有usr的行,做s*bin的替换

head -5 passwd | sed -n '/usr/s/s*bin/!!!/p'
> daemon:x:1:1:daemon:/usr/!!!:/usr/sbin/nologin
> !!!:x:2:2:bin:/bin:/usr/sbin/nologin
> sys:x:3:3:sys:/dev:/usr/!!!/nologin

其中的pattern也不是只能一组, 也能多组pattern
一种是之前提到的-e, 格式则变成-e 's/old/new/' s/old/new/'
也能用;作多组的分隔
格式变成行定位{s/old/new/;s/old/new/}
如果行定位是Regex则是/Regex/{s/old/new/;s/old/new/}

# 针对第1~3行, 把bin取代成!!!
# 针对第1~3行, 把usr取代成***
head -5 passwd | sed -r '1,3s/bin/!!!/;1,3s/usr/***/'      
> root:x:0:0:root:/root:/!!!/bash
> daemon:x:1:1:daemon:/***/s!!!:/usr/sbin/nologin
> !!!:x:2:2:bin:/bin:/***/sbin/nologin
> sys:x:3:3:sys:/dev:/usr/sbin/nologin
> sync:x:4:65534:sync:/bin:/bin/sync

head -5 passwd | sed -r -e '1,3s/bin/!!!/' -e '1,3s/usr/***/'  
> root:x:0:0:root:/root:/!!!/bash
> daemon:x:1:1:daemon:/***/s!!!:/usr/sbin/nologin
> !!!:x:2:2:bin:/bin:/***/sbin/nologin
> sys:x:3:3:sys:/dev:/usr/sbin/nologin
> sync:x:4:65534:sync:/bin:/bin/sync

# 针对第1~3行, 把bin取代成!!!
# 把有nologin的行给delete
head -5 passwd | sed -r -e '1,3s/bin/!!!/;/nologin/d'
> root:x:0:0:root:/root:/!!!/bash
> sync:x:4:65534:sync:/bin:/bin/sync

head -5 passwd | sed -r -e '1,3s/bin/!!!/' -e '/nologin/d'
> root:x:0:0:root:/root:/!!!/bash
> sync:x:4:65534:sync:/bin:/bin/sync

今日小结

今天介绍的是基本的sed修改操作,
能发现不管是grep、awk、sed, 想再实战中找到我们想要的行跟位置, 还是需要Regex基本的熟练度.

----参考来源
Regular-Expressions .Dot


<<:  D18 - 用 Swift 和公开资讯,打造投资理财的 Apps { 移动平均线(MA线)实作.1 }

>>:  Day 0x1B UVa10922 2 the 9s

WordPress 强制使用 https 连线 (使用 SSL 凭证)

在 Google 搜寻公告中,已经将 Https 连线列为重要的网站优化排名之中,拥有 https ...

了解内嵌、外嵌导入css方式

进入到css的环节,讲解如何使用内嵌、外嵌导入css的方式 要注意内嵌、外嵌使用方式不太一样 外嵌...

[Day1]PHP的资料型态01

PHP的资料型态 这里将纪录一些学习的笔记 Bollean布林值 算是最简单的资料型态,可以为tru...

天翼云盘免安装客户端下载文件

当天翼云盘下载按钮变灰没办法点击,如下图 可使用审核元素使之可以点击和获取下载链接 搜索 btn b...

[NestJS 带你飞!] DAY09 - Pipe (上)

什麽是 Pipe? Pipe 经常被用来处理使用者传入的参数,比如:验证参数的正确性、型别的转换等。...