linux-sed

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/84317407

三大文本编辑

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

grep看正则功底。

awk又比较全面。

先看看sed探探底。

命令结构

  • 使用结构
命令 选项 操作 文件
sed option action file
  • action
部分 组成A 组成B
action address command

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

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

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

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

action

address

符号 注释 说明
start,end start:起始行号
end:结束行号
匹配[start,end]
/regex/ 正则表达式 //声明是正则
/pattern1/,/pattern2/ 中间的都是正则 /pattern1/匹配的作为start
/pattern2/匹配的作为end
lineNumber 指定行号 精确指定某行
$ 最后一行 指定最后一行
start,+n start:起始行号
+n:向后匹配n
匹配[start, start+n]
start~period start:匹配起始行
~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\}
start,~end start,end start,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

command description comment
d delete 删除
p print 打印输出
a \string append 匹配行后添加新行
i \string insert 匹配行前插入新行
r file read 匹配行后插入文件内容
w file write 把匹配行输出指定文件
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,全部删除也不是非得麻烦一点,不是么。

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

mode description comment
i ignoreCase 忽略大小写
g global 全局匹配
m multiline 匹配多行
s singleline 匹配单行
x spaces 忽略空白
e execute 可执行模式
  • 分隔符
command split
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'

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

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

pattern quote target
/\(\)/ \n n N + n\in N^+ 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

command description comment
-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 不可缺少,其他部分总能够省略或者找到替代的方案。

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/84317407