linux-sed

本文深入讲解SED文本编辑器的使用技巧,包括命令结构、选项、操作及正则表达式的应用。SED通过address定位和command操作,实现文本的精确编辑,如删除、打印、添加、插入等。特别关注SED在正则匹配、替换、多行操作等方面的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三大文本编辑

命令特点说明
grep截取查找显示
sed编辑行编辑器,流操作
awk分析及处理复杂分析,处理

grep看正则功底。

awk又比较全面。

先看看sed探探底。

命令结构

  • 使用结构
命令选项操作文件
sedoptionactionfile
  • action
部分组成A组成B
actionaddresscommand

sed的灵魂所在,address定位,command操作。

sed主体就是通过action完成功能。

addresscommand直接相连,无任何连接符号。

  • 可变部分
部分变化
option可选参数
可以为空
支持多个
file支持多个
至少一个

action

address

符号注释说明
start,endstart:起始行号
end:结束行号
匹配[start,end]
/regex/正则表达式//声明是正则
/pattern1/,/pattern2/中间的都是正则/pattern1/匹配的作为start
/pattern2/匹配的作为end
lineNumber指定行号精确指定某行
$最后一行指定最后一行
start,+nstart:起始行号
+n:向后匹配n
匹配[start, start+n]
start~periodstart:匹配起始行
~period:指定周期
匹配 { x ∥ x = s t a r t + p e r i o d ∗ n , n ∈ N } \{x\|x=start+period*n,n\in N\} {xx=start+periodn,nN}
start,~endstart,endstart,end

d为操作符,表示删除,先演练一下。

# 删除前三行
# -----------
sed "1,3d" godme.file
# -----------
sed "1d" godme.file
sed "2d" godme.file
sed "3d" godme.file
# ----------------
sed "1,+2d" godme.file
# -------------
sed "1,~3d" godme.file
# 全部删除
# $记得用单引号进行转义
sed '1,$d' godme.file
# ----------
sed "1~1d" godme.file
# 删除奇数行
sed "1~2d" godme.file
# 删除 godme 相关行信息
sed '/godme/d' godme.file

command

commanddescriptioncomment
ddelete删除
pprint打印输出
a \stringappend匹配行后添加新行
i \stringinsert匹配行前插入新行
r fileread匹配行后插入文件内容
w filewrite把匹配行输出指定文件
s /pattern/string/[mode]match and replace查找匹配并替换
  • 区别
ll | sed 's/root/godme/g' 

s注定是替换操作,仅通过匹配实现定位,和具体的address无关。

在全部命令中,算是比较特殊的。

不过,也由此它也拥有二重锁定操作。

ll | sed '/judas/s/root/godme/g' 

这样就可以进行二次筛选。

  • 共通
# 文件覆盖
sed 'w judas' godme
# 文本复制
sed 'r godme' judas
# 全部删除
sed 'd' godme
# ...

由此可见,s的独立用法并非独特。

action = address + command:默认情况下,address是全面范围内操作。

action = [address]command,全部删除也不是非得麻烦一点,不是么。

不过二重筛选,也就只有那一个了。

modedescriptioncomment
iignoreCase忽略大小写
gglobal全局匹配
mmultiline匹配多行
ssingleline匹配单行
xspaces忽略空白
eexecute可执行模式
  • 分隔符
commandsplit
s///
s@@@
s###
s***

三个同样的特殊字符,都可以作为s的分隔符进行使用。

在匹配内容中存在特殊字符时,我们可以替换分隔符来简化正则。

字符不固定,可以多尝试几个,%什么的也可以。

  • 分组引用
ll | sed 's/\(r..t\)/\1er/g'
# 这样分隔更清楚
ll | sed 's#\(r..t\)#\1er#g'

所有的r..t都会变成r..ter

s中同样可以使用分组的后向引用,不过需要进行转义\(\)

ll | sed 's/r..t/&er/g'

如果熟悉c++,直接把&当做引用也没问题。

虽然分组可以引用,不过那是针对整体字符串中的单个分组部分。

&可以直接引用整个正则匹配到的内容。

如果整体就是目的,&比分组更方便。

如果正则中多个标记但是只修改其中一点,分组的方式会更加方便,看情景。

ll | sed 's/r\(oo\)t/g\1d/g'
ll | sed 's/r\(oo\)t/g&d/g'

\(\)比较繁琐,但是精准。

&比较快捷,但是可能存在糟粕.

patternquotetarget
/\(\)/\n n ∈ N + n\in N^+ nN+part or all
//&all
  • 一些注意

多行和单行,主要针对的是正则中存在换行符的情况。

默认匹配只匹配一次,想要能够匹配多个,请使用g全局。

# 打印指定行
# 双倍打印
sed '1,$p' godme.file
# 静默
sed -n '1,$p' godme.file
# 添加新行注释
sed '1,$a\#' godme.file
# 多行注释
sed '1,$a\#1\n#2' godme.file
# 前置
sed '1,$\#insert' godme.file 
# 拼接小说
sed '$r /home/godme/chapter2' chapter1
# 关键信息保存
sed '/godme/w /home/godme/message' /etc/passwd
# 全本复制
sed '1,$w /home/godme/book2' book
sed '2 /home/godme/book2' book

option

commanddescriptioncomment
-n--quiet
--silent
静默模式
仅操作,不打印
-i--in-place把修改写入源文件
-e--expression拼接隔离多个指令
-f--file指定脚本文件
-r--regexp-extended使用扩展正则
  • -n
# 默认输出一遍
# 操作打印一遍
sed 'p' godme
# 没有默认输出
# 只有操作打印
sed -n 'p' godme
  • -i
# 真的会全部删除的
# 慎用
sed -i 'd' godme
  • -e
# 想替换
# 也想删除
sed -e 's/root/godme/g' -e '1~2d' godme

有多个指令,两个都必须-e

  • -f
# script
s/root/godme/g
s/judas/godme/g
ll | sed -f script

脚本文件可以定义多条,直接引用脚本文件进行处理就行了。

  • -r

最没用的是它,最有用的也是它。

# 扩展模式之后,括号不用再转义
ll | sed -r 's/(root)/\1er/g'
# 扩展模式之后,常用的正则也能够应用了
ll | sed -r 's/o{2}/bb/g'
# 要记得 通配符  基本正则  扩展正则
# 我们经常使用的是 扩展正则哦

除此之外,没其他用处了,哈哈哈。

梳理

  • 多选项
sed -n -i -f script godme
  • 多命令
sed -e 's/root/godme/g' -e 'p' godme 
  • 多文件
sed -e '/s/root/godme/g' godme judas
  • 缺选项
sed '1p' godme
  • 缺地址
sed -n 'p' godme
  • 缺文件
ll | sed -r '1,2s/root/godme/g'
  • 多多多
sed -n -i -e 's/root/godme/g' -e '1~2d' godme judas

对于sedcommand 不可缺少,其他部分总能够省略或者找到替代的方案。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值