文本处理sed

2022/9/16 6:17:27

本文主要是介绍文本处理sed,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


目录
  • sed简介
  • sed基本命令
    • 命令格式
    • 常用选项options
    • 地址定界
    • 编辑命令command
  • 用法演示
  • sed高级编辑命令

sed简介

1、sed 是什么

  sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大,可以在大多数操作系统中使用。

  sed 的出现作为 grep 的继任者,与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed 基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。

2、sed 工作原理

  sed 会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed基本命令

命令格式

语法:

sed [options] '[地址定界] command' file(s)

常用选项options

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • -e:多点编辑,对每行处理时,可以有多个Script
  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
  • -r:支持扩展的正则表达式
  • -i:直接将处理的结果写入文件
  • -i.bak:在将处理的结果写入文件之前备份一份

地址定界

默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"。

  • 不给地址:对全文进行处理
  • 单地址:
    • '#': 指定的行
    • /pattern/:被此处模式所能够匹配到的每一行
  • 地址范围:
    • '#', #
    • '#', +#
    • /pat1/,/pat2/
    • '#',/pat1/
  • ~:步进
    • sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)
    • sed -n '2~2p' 只打印偶数行

编辑命令command

  • d:删除模式空间匹配的行,并立即启用下一轮循环
  • p:打印当前模式空间内容,追加到默认输出之后
  • a:在指定行后面追加文本,支持使用\n实现多行追加
  • i:在行前面插入文本,支持使用\n实现多行追加
  • c:替换行为单行或多行文本,支持使用\n实现多行追加
  • w:保存模式匹配的行至指定文件
  • r:读取指定文件的文本至模式空间中匹配到的行后
  • =:为模式空间中的行打印行号
  • !:模式空间中匹配行取反处理
  • s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
    • 加g表示行内全局替换;
    • 在替换时,可以加一下命令,实现大小写转换
    • \l:把下个字符转换成小写。
    • \L:把replacement字母转换成小写,直到\U或\E出现。
    • \u:把下个字符转换成大写。
    • \U:把replacement字母转换成大写,直到\L或\E出现。
    • \E:停止以\L或\U开始的大小写转换

用法演示

常用选项options演示

[root@localhost ~]# cat z
aaa
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '/aaa/p' z   #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed -n '/aaa/p' z      #-n不显示没匹配的行
aaa
[root@localhost ~]# sed -e 's/a/A/' -e 's/b/B/' z    #-e多点编辑
Aaa
Bbbb
ccc
AABBCCDD
[root@localhost ~]# cat sed.txt 
s/A/a/g
[root@localhost ~]# sed -f sed.txt z      #-f使用文件处理
aaa
bbbb
ccc
aaBBCCDD

[root@localhost ~]# sed -i.bak 's/a/A/g' z   #-i直接对文件进行处理
[root@localhost ~]# cat z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# cat z.bak 
aaa
bbbb
ccc
AABBCCDD

地址界定演示

[root@localhost ~]# cat z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed -n 'p'  z      #不指定行,打印全文
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '2s/b/B/g' z       #替换第2行的b->B
AAA
BBBB
ccc
AABBCCDD
[root@localhost ~]# sed -n '/AA/p' z    #打印AA的行
AAA
AABBCCDD
[root@localhost ~]# sed -n '1,2p' z    #打印1-2行
AAA
bbbb
[root@localhost ~]# sed -n '/AAA/,/DD/p' z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed -n '2,/DD/p' z
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '2~2s/[bB]/Z/g' z  #将偶数行的b或A替换为Z
AAA
ZZZZ
ccc
AAZZCCDD

编辑命令command演示

[root@localhost ~]# cat z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '2d' z      #删除第2行
AAA
ccc
AABBCCDD
[root@localhost ~]# sed -n '2p' z    #打印第2行
bbbb
[root@localhost ~]# sed '2a123' z    #在第2行后加123
AAA
bbbb
123
ccc
AABBCCDD
[root@localhost ~]# sed '1i123' z    #在第1行前加123
123
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '3c123\n456' z      #替换第3行内容
AAA
bbbb
123
456
AABBCCDD
[root@localhost ~]# sed -n '3w/root/z3' z  #保存第3行的内容到z3文件中
[root@localhost ~]# cat z3
ccc
[root@localhost ~]# sed '1r/root/z3' z     #读取z3的内容到第1行后
AAA
ccc
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed  '=' z      #=打印行号
1
AAA
2
bbbb
3
ccc
4
AABBCCDD
[root@localhost ~]# sed -n '2!p' z    #打印除了第2行的内容
AAA
ccc
AABBCCDD
[root@localhost ~]# sed 's@[a-z]@\u&@g' z     #将全文的小写字母替换为大写字母
AAA
BBBB
CCC
AABBCCDD

sed高级编辑命令

选项:

  • h:把模式空间中的内容覆盖至保持空间中
  • H:把模式空间中的内容追加至保持空间中
  • g:从保持空间取出数据覆盖至模式空间
  • G:从保持空间取出内容追加至模式空间
  • x:把模式空间中的内容与保持空间中的内容进行互换
  • n:读取匹配到的行的下一行覆盖 至模式空间
  • N:读取匹配到的行的下一行追加 至模式空间
  • d:删除模式空间中的行
  • D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

1.一个案例+示意图演示

案例:倒序输出文本内容

[root@localhost ~]# cat num.txt 
one
two
three
[root@localhost ~]# sed '1!G;h;$!d' num.txt 
three
two
one

示意图如下:

[root@localhost ~]# cat z
1
2
11
22
111
222
#将匹配到的1复制到保持空间,并删除模式空间的1,再匹配2时,将保持空间的文本追加到匹配的2后面
[root@localhost ~]# sed '/1/{h;d};/2/{G}' z
2
1
22
11
222
111
[root@localhost ~]# cat c
hello world 1

hello world 2


hello world 3



hello world 4




happy
#将多个空行减少到一行
[root@localhost ~]# sed '/^$/{N;/^\n$/d;}' c
hello world 1

hello world 2
hello world 3

hello world 4
happy
[root@localhost ~]# sed '/^$/{N;/^\n$/D;}' c
hello world 1

hello world 2

hello world 3

hello world 4

happy
[root@localhost ~]#


这篇关于文本处理sed的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程