文本三剑客之Sed

Sed是一个强大的文本解析工具,常用于自动化文本处理任务。它的工作流程包括读取、执行和显示,能对文本进行删除、替换、添加等操作。通过地址范围可以对特定行进行操作,如按行号选择、字符串过滤和删除。Sed命令的常见用法包括字符串替换、行的插入和删除等。

目录

1. Sed编辑器

     1.Sed概述

     2.Sed工作流程

    3.Sed命令常见用法

2.对指定行操作(寻址)

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

2.用字符串来过滤行

3.删除指定行

3.替换

      1.字符串

      2.替换整行内容

      3.字符替换

4.增加(插入)内容


1. Sed编辑器

     1.Sed概述

    (1)sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。

   (2)sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于shell脚本中,用以完成各种自动化处理任务

     2.Sed工作流程

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

      (1)读取: sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
      (2)执行: 默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行
      (3)显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空
   在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完

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

    3.Sed命令常见用法

        通常情况下调用sed命令两种格式,如下所示。

     (1)“参数”是指操作的目标文件,当存在多个操作对象时用,文件之间用逗号“,”分隔

     (2)scriptfile 表示脚本文件,需要用“ -f ” 选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。

    (3)基本格式

 
sed -e  '操作' 文件1 文件2..
 
sed -n -e '操作1;操作2' 文件1 文件2 ..
 
sed -f  脚本文件  文件1  文件2 ...
 
sed -i -e  '操作' 文件1 文件2 ...
sed  -e  'n {
  操作1
  操作2
}'  文件1  文件2 ...

(4)sed命令常用选项

选项功能
-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件
-f 或–file=:表示用指定的脚本文件来处理输入的文本文件
-h 或–help显示帮助
-n、–quiet 或 silent表示仅显示处理后的结果
-i.bak直接编辑文本文件
-r, -E使用扩展正则表达式
-s将多个文件视为独立文件,而不是单个连续的长文件流

(5)sed常用的操作命令

“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。
通常情况下是采用的“[n1[,n2]]”操作参数的格式。
n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。
常见的操作包括以下几种:
s∶替换,替换指定字符。

d∶删除,删除选定的行。

a∶ 增加,在当前行下面增加一行指定内容。

i∶ 插入,在选定行上面插入一行指定内容。

c∶ 替换,将选定行替换为指定内容。

Y∶ 字符转换,转换前后的字符长度必须相同。

p∶ 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容; 如果有非打印字符,则以 AscII码输出。其通常与_n"选项一起使用。

=∶打印行号。

l(小写L)∶打印数据流中的文本和不可打印的ASCII字符(比如结束符s、制表符\t)

  sed -p 打印

sed -n:禁止sed编辑器输出 

操作‘=’:打印行号

操作 ‘l’:打印数据流中的文本和不可打印的ASCII字符

sed -e 多个操作

sed -n -e '命令1' -e '命令2' 文件
或者
sed -n -e '命令1;命令2' 文件
或者
sed -n '
命令1 
命令2
....
' 文件

或者使用换行打印文件内容 

2.对指定行操作(寻址)

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

作用选项
sed -n '#p'  #代表行号  打印第#行内容
sed -n '#,@p'#代表行号  打印第#行到第@行内容
sed -n '$p'  #代表行号  打印最后一行内容
sed -n '#,+@p'  #代表行号  打印第#行到第@+#行内容
sed -e '#q'#代表行号  打印第1行到第#行内容

 

打印奇数行或者偶数行

2.用字符串来过滤行

3.删除指定行

  sed  'd'

sed '/#/,/@/d' 文件名

 sed会读取每行的内容,从第一个位置#打开删除功能,到第二位置@删完后关闭删除功能,再继续查询与  #和@匹配的行 进行删除 一直重复此操作

3.替换

  1.字符串

格式:行范围  s/旧字符串/新字符串/替换标记

替换标记

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

(1)sed -g、sed -s  替换

       替换命令的分隔符看 s后面跟的字符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符则需要使用"\"来转义。

       将/bin/bash 转换为 /sbin/nologin,因为替换的格式为 s/旧/新  此处的"/"为分隔符 但是/bin/bash与/sbin/nologin中的"/"为根,容易引起歧义。

可以使用"\"转义字符将"/"转义为普通字符

或者使用其他字符作为分隔符,且所有分隔符保持一致(s后面的内容就是分隔符)

添加

sed 's/^/要添加内容/' 文件 

注释行内容

 删除

2.替换整行内容

替换前与替换后的字符可以不一致

sed '#c 新内容 文件名     #替换第#行的全部内容
或者
sed '/旧内容/c  新内容' 文件名       #将被筛选到(含有旧内容)的行替换为新内容

3.字符替换

替换前与替换后的字符个数需要一致

sed 'y/旧内容/新内容/' 文件名

4.增加(插入)内容

1.在行前插入内容

2.在行后插入内容

3.插入文件内容

4.剪切粘贴

5.复制粘贴

6.调换顺序

### 关于 Sed 的使用教程 Sed(Stream Editor)是一个功能强大的流编辑器,广泛应用于 Linux 和 Unix 系统中。它可以高效地完成多种文本处理任务,例如查找、替换、删除以及格式化文本等操作[^1]。 #### 基本语法结构 Sed 的基本语法如下所示: ```bash sed [选项] '地址范围 操作命令' 文件名 ``` - **选项**:常用的选项包括 `-n` 表示只打印经过 `p` 命令处理的内容;`-e` 可以指定多条命令;`-f` 从脚本文件加载命令;`-i` 实现原地修改文件内容。 - **地址范围**:可以是具体的行号或者通过正则表达式匹配的模式。 - **操作命令**:常见的有替换 (`s`)、删除 (`d`)、插入 (`i`) 和追加 (`a`) 等。 --- #### 替换操作 (s 命令) `s` 命令是最常使用的命令之一,用于将特定文本替换为其他文本。其通用形式为: ```bash sed 's/pattern/replacement/flags' ``` - `pattern`: 被替换的目标字符串或正则表达式。 - `replacement`: 新的替代字符串。 - `flags`: 控制行为的标志位,比如 `g` 表示全局替换,`i` 忽略大小写。 ##### 示例代码 假设有一个名为 `example.txt` 的文件,内容如下: ``` hello world error found here another error line ``` 以下是几个典型的替换例子: ```bash # 将所有的 "error" 替换为 "warning" sed 's/error/warning/g' example.txt # 输出结果: # hello world # warning found here # another warning line ``` 如果只想替换每行的第一个匹配项,则省略 `/g` 参数: ```bash sed 's/error/warning/' example.txt # 输出结果: # hello world # warning found here # another error line ``` 还可以利用反向引用捕获分组并重新排列它们: ```bash echo "John Smith" | sed 's/\(.*\), \(.*\)/\2 \1/' # 输入:"Smith, John" # 输出:"John Smith" ``` --- #### 删除操作 (d 命令) `d` 命令用于删除满足条件的行。例如,删除包含某个关键字的所有行: ```bash sed '/pattern/d' 文件名 ``` ##### 示例代码 继续以上述 `example.txt` 文件为例: ```bash # 删除包含 "error" 的所有行 sed '/error/d' example.txt # 输出结果: # hello world ``` 也可以按照行号来删除某一行或多行: ```bash sed '2d' example.txt # 删除第 2 行 sed '2,3d' example.txt # 删除第 2 到第 3 行 ``` --- #### 插入与附加操作 (i/a 命令) - `i` 命令在指定位置之前插入新行。 - `a` 命令在指定位置之后附加新行。 ##### 示例代码 ```bash # 在第二行前插入一条消息 sed '2i This is an inserted line.' example.txt # 输出结果: # hello world # This is an inserted line. # error found here # another error line ``` 对于追加操作: ```bash sed '2a Appended after the second line.' example.txt # 输出结果: # hello world # error found here # Appended after the second line. # another error line ``` --- #### 组合多个命令 可以通过分号 `;` 连接多个命令,在单次调用中完成复杂任务。例如: ```bash sed -e 's/error/warning/g' -e '$ a End of file message' example.txt ``` 上述命令先将所有 `error` 替换为 `warning`,再在最后一行后面追加一段文字。 --- #### 原地编辑 (-i 选项) 当希望直接修改源文件而非仅显示改动时,可启用 `-i` 参数。例如: ```bash sed -i 's/error/warning/g' example.txt ``` 这会永久保存对 `example.txt` 的更改。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值