Java教程

sed 流编辑器

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

sed

目录
  • sed
    • 一 sed 编辑器
      • 1.1sed的工作流程
    • 二:sed 命令使用
      • 2.1 格式
      • 2.2 常用选项
      • 2.3 常用操作
      • 2.4 示例
    • 三:sed 的 寻址方式
      • 3.1 数字形式表示区间
        • 3.1.1 sed 的步长
      • 3.2 用文本模式来过滤出行
        • 3.2.1 正则匹配
        • 3.2.2 sed 的打开与关闭
        • 3.3 sed 的 n 读取下一行,及q 退出
        • 3.3.1 n操作,读取下一行
        • 3.3.2 q 退出操作
    • 四: sed 的替换操作
      • 4.1 格式
      • 4.2 s 操作进行替换
      • 4.3 sed与选项 -f 一起使用
      • 4.4 sed 使用 c 操作 整行替换
      • 4.5 sed 使用 y 进行替换
      • 4.6 sed 的字符串分隔符
    • 五 sed 的删除操作
    • 六 插入
      • 6.1 i 行前插入,a 行后插入,r 读入文本
      • 6.2 sed 剪切复制操作
    • 7 使用sed 将字符串互换位置
      • 7.1 将 111 和 222 互换位置
      • 7.2 将第一个字符和最后一个字互换位置
      • 7.3 将ip 地址反向输出

一 sed 编辑器

  • sed 是一种六编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流
  • sed 编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存在在一个命令文件中

1.1sed的工作流程


sed 的工作流程主要包括 读取,执行 ,显示, 三个过程

  • 读取:sed从输入流(文件,管道,标准输入)中读取一行内容并存储到临时的缓冲区中(又称为模式空间)
  • 执行:默认情况下,所有sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
  • 显示:发送修改后的内容到输出流。在发送该数据后,模式空间将会被清空。

在所有的文件内容都被处理完之前,上述过程将重复执行,直到所有内容都被处理完

默认情况下所有的sed命令都是在模式空间内执行,因此输入的文件并不会发生任何变化,除非用重定向存储输出

sed 默认只支持基础正则


二:sed 命令使用

2.1 格式

sed -e '操作' 文件1 文件2 ...

sed -n -e '操作' 文件1 文件2 ....

sed -f 脚本文件 文件1 文件2 ...

sed -i -e '操作' 文件1 文件2

sed  -e 'n{
操作1 
操作2 ..... }'  文件1 文件2

2.2 常用选项

选项 释义
-e 或者 --expression= 表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略一般在执行多个操作命令使用
f 或者--file= 表示用指定的脚本文件来处理输入的文本文件
h 或者 --help 显示帮助
-n , --quit 或者silent 禁止sed 编辑器输出。可以与p命令一起使用完成输出
-r 让sed 支持扩展正则表达式
-s 将输入的文件视为各个独立的文件,而不是一个长的连续输入
-i 直接修改目标文本文件

sed 的操作,如果不加 -i 选项,是不会改变文件内容的


2.3 常用操作

操作 释义
s 替换,替换指定字符
d 删除,删除选定的行
a 增加,在当前行的下面增加一行指定内容
i 插入,在选定行的上面插入一行指定内容
c 替换,将选定行整行替换为指定内容
y 字符转换,转换前后的字符长度必须相同(不能对正则表达式使用)
p 答应,如果同时指定行,表示打印行。如果不指定行,则表示打印所有内容
= 打印行号
l(小写L) 打印数据流中的文本和不可打印的ASCII 字符(如结束符$,制表符 \t)
n 读取下一行内容
q 退出sed程序
取反
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间里的内容追加到暂存缓冲区
g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
w 文件 将所选的行写入文件

2.4 示例


image-20210728093525890


三:sed 的 寻址方式

  1. 以数字形式表示行区间

    sed -n '3p' testfile #打印第三行

  2. 用文本模式来过滤出行

    sed -n '/a/p' testfile #打印包含a的行


3.1 数字形式表示区间

  • sed 可以用 1,2,3,4 .... 整数表示行。 "$" 可以表示最后一行。
  • 如果想表示从多少行,到多少行, 可以写出开始行和结尾行,中间以逗号"," 隔开.如:sed -n '1p,3p' testfile1 表示打印第一行到第三行

image-20210728101441899


3.1.1 sed 的步长

如; sed -n '1~2p' testfile , “1~2p” 表示 从第一行开始打印,步长是2,也就是打印奇数行

image-20210728102028325


3.2 用文本模式来过滤出行

sed 可以将要匹配的内容写在斜线"/" 之间 如: sed -n '/a/p' testfile2 表示匹配包含 a 的行并打印

image-20210728103708970


3.2.1 正则匹配

sed 默认支持基础正则。如果使用扩展正则,需要加上选项 -r

image-20210728094905233


3.2.2 sed 的打开与关闭

image-20210728113526485

sed -n '/a/, /b/p' testfile2

#遇到匹配a 的行,打开 p ,打印操作。遇到匹配b 的行,关闭打印操作
#如果执行 打开 p 打印操作后,没有匹配到 含有 b 的行,则会一直打印,知道 匹配到含有b的行

3.3 sed 的 n 读取下一行,及q 退出

3.3.1 n操作,读取下一行


image-20210728110748430

  • sed 先读取了第 1 行,然后执行 了 p 打印操作,打印了第 1 行的内容

  • 之后,再执行 n 操作,读取下一行,也就是读取第 2 行。但是因为后续没有 p 打印操作,所以,第 2 行灭有打印

  • 然后,sed 读取第 3 行内容,执行 p 打印操作,打印 第 3 行内容

  • 之后,再执行n 操作, 读取下一行,也就是读取第 4 行。但是,依旧因为没有p 操作,无法打印出来


image-20210728111342560

sed 先读取第 1 行内容, 因为内有 p 操作,所以,第一行没有打印。

再执行n 命令,读取下一行 ,也就是读取第2 行,之后再执行 p 命令,将第 2 行打印出来


image-20210728114448731

sed 读取 从第 5 行 到 最后一行。中间以 np 的 形式操作。

读取 第 5 行 ,因为没有 p 操作,所以不打印。然后执行 n操作 ,读取下一行的,也就是读取 第6 行。然后再执行 p 打印操作,打印第 6 行

然后 再读取第 7 行,之后,不打印。执行 n 操作,读取下一行,也就是读取第 8 行。然后再执行 p打印操作,打印第8 行。

一直循环,一直到最后一行


3.3.2 q 退出操作


image-20210728113053111

  • sed 工作流程: 读取,执行,打印。
  • 当工作到第5行时,执行完打印的操作后,执行 q 退出操作。

也就是说,sed '5q' testfile1 命令,sed 只读取到第 5行 就终止了工作


四: sed 的替换操作

4.1 格式

行范围 s/旧字符/新字符/替换标记 #字符替换

行范围c 新字符 #整行替换

行范围 y/旧字符串/新字符串 #旧字符串的长度要和新字符串长度一样

替换标记

标记 释义
数字 表明新字符串将替换地基础匹配的地方
g 表明新字符串将会替换所有匹配的地方
p 打印与替换命令匹配的行,与 -n 选项一起使用
w 文件 将替换的结果写到文件中

4.2 s 操作进行替换


image-20210728101019036


image-20210728120316619


image-20210728121326132


image-20210728121105361


4.3 sed与选项 -f 一起使用

  1. 先编写支持sed 命令的脚本

    vim  1.sed
    
    /^root/  s/^/#/p       # 将所有root开头的行,加上#号注释
    /nologin$/  s/nologin/false/p   #将所有nologin结尾的行,将nologin替换为false  
    :wq
    
  2. 执行sed 命令

    选项 -f 后面加上支持sed的脚本文件

    [root@host103 test]# sed -n -f 1.sed /etc/passwd

image-20210728122405905


4.4 sed 使用 c 操作 整行替换

image-20210728124204822


4.5 sed 使用 y 进行替换

image-20210728213730820


4.6 sed 的字符串分隔符

sed 替换时,字符串的分隔符 不是必须为 "/" ,也可以为 “@”,“#” ,“1”,“2”,"a" ,"b" ... 只要保持一致即可

image-20210728125434516


image-20210728125828281


五 sed 的删除操作

image-20210728124602152

image-20210728124634735

image-20210728124814028


六 插入

6.1 i 行前插入,a 行后插入,r 读入文本


image-20210728212959573

image-20210728213329979


6.2 sed 剪切复制操作

h/H 复制到剪切板,g/G 黏贴到指定行

image-20210728221725116

image-20210728222031371

image-20210728222127636


7 使用sed 将字符串互换位置

s/()()/\2\1

使用 ()括号,将模式空间内容整体分段复制到保留空间

再按照一定顺序输出到模式空间

7.1 将 111 和 222 互换位置

image-20210728223224765


7.2 将第一个字符和最后一个字互换位置

image-20210728223816952


7.3 将ip 地址反向输出

image-20210728224116993

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