当前位置: 首页 > news >正文

8.Shell脚本修炼手册---sed工具的基本使用

sed工具的基本使用

文章目录

    • sed工具的基本使用
      • sed 介绍
      • sed 工作流程
      • sed 注意事项
      • sed 命令语法
        • sed 帮助查看
        • 基本语法格式
        • 基础示例
      • 常用选项
        • -e 选项:执行多个命令
        • -f 选项:从文件读取命令
        • -n 选项:取消自动输出
        • -i 选项:直接修改原文件
        • -r 选项:支持扩展正则表达式
      • sed 行寻址(指定要处理的行)
        • 语法格式
        • 实验流程(以打印行为例)
        • 示例
      • sed 模式寻址(按内容匹配行)
        • 实验流程
        • 示例
      • sed 核心子命令
        • 打印命令(p/P)
        • 读取下一行(n/N)
        • 替换命令(s)
        • 删除命令(d/D)
        • 插入命令(i/a)
        • 行首 / 行尾插入
        • 大小写转换(y)
        • 保存和读取(h/H/g/G)
      • 多命令执行(;/{}/-e)
      • 退出命令(q)
      • 取反命令(!)
      • 正则表达式在 sed 中的使用
      • 列表命令(l)
      • 总结
      • 列表命令(l)
      • 总结

sed 介绍

sed,英文全称 stream editor(流编辑器),是一种非交互式的文本处理工具,功能非常强大。简单来说,它能像流水线一样一行一行处理文本,不需要我们手动逐行操作。

在运维人员中, sed 和 awk 被称为 Unix/Linux 世界的 “王牌文字处理器”:

  • sed 侧重点是替换(比如批量修改文本中的特定内容)。
  • awk 侧重点是分割和重新合成(比如按逗号分割文本后,提取特定列重新排列)。

sed 工作流程

sed 的工作流程很像工厂的流水线,简单来说就是 “读一行、处理一行、输出一行”,循环直到所有内容处理完。

读取行 → 执行命令 → 显示结果 → 读取下一行 → 执行命令 → 显示结果 → ...(直到处理完所有行)

sed 工作流程

具体步骤拆解:

  1. 读取行
    sed 从输入源(可以是文件、管道、键盘输入)中读取一行文本,存到内存中的一个临时空间,这个空间叫做 pattern space(可以理解为 “工作台”,专门放当前正在处理的内容)。
    同时,sed 会记录当前处理的是第几行(行号计数器)。
  2. 执行命令
    按照我们给的 sed 命令,对 pattern space 里的这一行文本进行处理(比如替换、删除等)。
    默认情况下,sed 会处理所有行;但如果我们指定了行号(比如只处理第 3 行),就只会处理指定的行。
  3. 显示结果
    处理完后,把 pattern space 里的内容输出到目标(可以是屏幕、文件、管道),然后清空这个 “工作台”,准备处理下一行。
  4. 重复上面的步骤,直到所有输入内容都处理完。

sed 注意事项

虽然流程简单,但有几个关键概念需要理解:

  • pattern space(工作台):是内存中的临时区域,只存当前正在处理的行,处理完就清空。因为是内存中的数据,关闭终端或关机后就没了。
  • 默认不修改源文件:sed 处理的是 pattern space 里的副本,不会直接改原文件。如果想直接修改原文件,GNU sed 提供了 -i 选项(后面会详细说)。
  • hold space(储物柜):内存中另一个临时区域,用来存放暂时不用的数据(比如处理到后面需要用到前面的行)。和 pattern space 不同,它不会自动清空,除非手动操作。
  • 初始状态:pattern spacehold space 一开始都是空的。
  • 输入源:如果不指定输入文件,sed 会默认从键盘输入(标准输入)读取内容。
  • 行范围:默认处理所有行,但可以指定范围(比如第 2-5 行,或包含 “abc” 的行)。

sed 命令语法

sed 帮助查看

想快速了解 sed 的所有选项和用法,可以直接在终端输入 sed --help

[bq@shell ~]$ sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...-n, --quiet, --silent          # 取消自动打印 pattern space(默认会自动输出处理后的内容,加了这个选项就只输出我们指定要打印的内容)-e script, --expression=script # 后面跟 sed 命令(可以多次使用,执行多个命令)-f script-file, --file=script-file # 从文件中读取 sed 命令(适合命令较多的情况)--follow-symlinks              # 使用 -i 修改文件时,跟随软链接-i[SUFFIX], --in-place[=SUFFIX] # 直接修改原文件(如果加后缀,比如 -i.bak,会先备份原文件为 xxx.bak,再修改原文件)-l N, --line-length=N          # 指定“l”命令的换行长度--posix                        # 关闭所有 GNU 扩展(只使用 POSIX 标准语法)-r, --regexp-extended          # 使用扩展正则表达式(不需要对括号等特殊字符转义)-s, --separate                 # 把多个输入文件当作独立文件处理(而不是合并成一个流)-u, --unspaceed                # 从输入文件读取最少数据,更频繁刷新输出-z, --null-data                # 用 NUL 字符分隔行(默认用换行符)--help                         # 显示帮助信息并退出--version                      # 输出版本信息并退出# 常用子命令(后面会详细说)-a ∶ 新增内容,在匹配行的下一行插入-c ∶ 替换行,用指定内容替换匹配的行-d ∶ 删除行,删除匹配的行-i ∶ 插入内容,在匹配行的上一行插入-p ∶ 打印行,输出 pattern space 中的内容-s ∶ 替换文本,在行内替换指定内容(支持正则)
基本语法格式

sed 命令的核心结构可以简化为:

sed [选项] [sed命令] [输入文件]

由 4 部分组成:

  1. sed:命令本身。
  2. [选项]:改变 sed 工作方式的参数(比如 -n-i 等)。
  3. [sed命令]:具体的处理动作(比如替换、删除等)。
  4. [输入文件]:要处理的文件,不指定则从键盘输入。
基础示例

示例 1:模拟 cat 命令打印文件内容
如果 sed 命令为空(''),它会像 cat 一样直接输出文件内容(因为默认会把处理后的内容输出,而这里没有任何处理)。

# 准备测试文件 data.txt
[bq@shell ~]$ cat data.txt 
I am studying sed
I am www.twle.cn
I am a no-work-men
I am so handsome# 用 sed 打印文件内容(等价于 cat data.txt)
[bq@shell ~]$ sed '' data.txt 
I am studying sed
I am www.twle.cn
I am a no-work-men
I am so handsome

示例 2:从键盘输入读取数据
如果不指定输入文件,sed 会等待键盘输入,输入一行就处理一行并输出。

[bq@shell ~]$ sed ''  # 执行后等待输入
hello world  # 手动输入这行,按回车
hello world  # sed 直接输出(未处理)
# 按 Ctrl+d 退出

常用选项

-e 选项:执行多个命令

-e 用于在命令行中直接指定 sed 命令,多个命令可以用 -e 分开,也可以用分号 ; 分隔。

# 示例:删除 data.txt 的第1行、第2行(第5行不存在,所以无效果)
[bq@shell ~]$ sed -e '1d' -e '2d' -e '5d' data.txt 
I am a no-work-men  # 只剩第3、4行
I am so handsome# 等价于用分号分隔多个命令
[bq@shell ~]$ sed -e '1d;2d;5d' data.txt 
I am a no-work-men
I am so handsome# 单个命令时,-e 可以省略
[bq@shell ~]$ sed '1d' data.txt  # 只删除第1行
I am www.twle.cn
I am a no-work-men
I am so handsome
-f 选项:从文件读取命令

如果有很多 sed 命令,可以把它们写到一个文件里,用 -f 选项加载执行(每个命令单独占一行)。

# 1. 创建命令文件 scripts(内容是要执行的 sed 命令)
[bq@shell ~]$ echo -e "1d\n2d\n5d" > scripts  # 1d:删第1行;2d:删第2行;5d:删第5行
[bq@shell ~]$ cat scripts 
1d
2d
5d# 2. 用 -f 加载命令文件处理 data.txt
[bq@shell ~]$ sed -f scripts data.txt 
I am a no-work-men
I am so handsome
-n 选项:取消自动输出

默认情况下,sed 会自动输出 pattern space 里的内容(不管有没有处理)。-n 选项会关闭这个自动输出,只输出我们用 p 命令指定要打印的内容。

# 不指定 -n 时,空命令会输出所有内容
[bq@shell ~]$ sed '' data.txt  # 输出所有行# 指定 -n 后,空命令无输出(因为自动输出被关闭,又没指定打印命令)
[bq@shell ~]$ sed -n '' data.txt  # 无任何输出# 用 -n 配合 p 命令,只打印第1行
[bq@shell ~]$ sed -n '1p' data.txt 
I am studying sed
-i 选项:直接修改原文件

默认情况下,sed 只处理内存中的副本,不修改原文件。-i 选项可以直接修改原文件,还可以加后缀备份(比如 -i.bak 会先存一个 .bak 备份)。

# 准备测试文件 test.txt
[bq@shell ~]$ echo "hello world" > test.txt
[bq@shell ~]$ cat test.txt 
hello world# 用 -i 直接修改原文件(把 world 换成 linux)
[bq@shell ~]$ sed -i 's/world/linux/' test.txt 
[bq@shell ~]$ cat test.txt  # 原文件已被修改
hello linux# 带备份的修改(-i.bak 会生成 test.txt.bak 备份)
[bq@shell ~]$ sed -i.bak 's/linux/unix/' test.txt 
[bq@shell ~]$ ls test.txt*  # 查看文件
test.txt  test.txt.bak
[bq@shell ~]$ cat test.txt  # 修改后的内容
hello unix
[bq@shell ~]$ cat test.txt.bak  # 备份的原内容
hello linux
-r 选项:支持扩展正则表达式

默认情况下,sed 使用基础正则表达式,括号 ()、竖线 | 等需要转义(加 \)。-r 选项可以使用扩展正则,不需要转义。

# 基础正则:匹配包含 root 或 bin 的行(需要转义 | 和 ())
[bq@shell ~]$ sed -n '/\(root\|bin\)/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin# 扩展正则(-r):同样的匹配,不需要转义
[bq@shell ~]$ sed -nr '/(root|bin)/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

sed 行寻址(指定要处理的行)

行寻址就是告诉 sed:“只处理这些行,其他行不管”。可以通过行号或范围指定。

语法格式

以打印命令 p 为例,基本格式:

[起始行[,结束行]]p
  • 不指定行:处理所有行。
  • 单一行号:只处理指定行(比如 3p 只处理第 3 行)。
  • 行范围:处理从起始行到结束行的所有行(比如 2,5p 处理第 2-5 行)。
实验流程(以打印行为例)
  1. 准备测试文件 test

    [bq@shell ~]$ echo -e 'This is 1\nThis is 2\nThis is 3\nThis is 4\nThis is 5' > test
    [bq@shell ~]$ cat test
    This is 1
    This is 2
    This is 3
    This is 4
    This is 5
    
  2. 执行不同的行寻址命令,观察输出。

示例

示例 1:打印所有行
两种方式:sed 默认自动输出所有行;或用 -n 配合 p 命令强制打印所有行。

# 方式1:默认行为(自动输出所有行)
[bq@shell ~]$ sed '' test
This is 1
This is 2
This is 3
This is 4
This is 5# 方式2:-n 关闭自动输出,p 命令强制打印所有行(等价于方式1)
[bq@shell ~]$ sed -n 'p' test
This is 1
This is 2
This is 3
This is 4
This is 5

示例 2:打印特定行

  • 行号 N:打印第 N 行。
  • $ 代表最后一行。
# 打印第1行
[bq@shell ~]$ sed -n '1p' test
This is 1# 打印最后一行
[bq@shell ~]$ sed -n '$p' test
This is 5

示例 3:打印行范围

  • N,M:打印第 N 到第 M 行。
  • N,$:打印第 N 行到最后一行。
# 打印第1-3行
[bq@shell ~]$ sed -n '1,3p' test
This is 1
This is 2
This is 3# 打印第3行到最后一行
[bq@shell ~]$ sed -n '3,$p' test
This is 3
This is 4
This is 5

示例 4:连续行和间隔行

  • N,+M:从第 N 行开始,打印包括它在内的后续 M+1 行(比如 2,+2 是第 2、3、4 行)。
  • N~M:从第 N 行开始,每隔 M-1 行打印一次(比如 1~2 是第 1、3、5 行)。
# 从第2行开始,打印后续2行(共3行:2、3、4)
[bq@shell ~]$ sed -n '2,+2p' test
This is 2
This is 3
This is 4# 从第1行开始,每隔1行打印一次(奇数行:1、3、5)
[bq@shell ~]$ sed -n '1~2p' test
This is 1
This is 3
This is 5

sed 模式寻址(按内容匹配行)

除了行号,还可以通过 “内容模式”(字符串或正则表达式)指定要处理的行,格式为 /模式/

实验流程
  1. 准备测试文件 test(包含用户信息):

    [bq@shell ~]$ cat << 'EOF' > ~/test
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/bin/false
    daemon:x:2:2:daemon:/sbin:/bin/false
    mail:x:8:12:mail:/var/spool/mail:/bin/false
    ftp:x:14:11:ftp:/home/ftp:/bin/false
    &nobody:$:99:99:nobody:/:/bin/false
    zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
    http:x:33:33::/srv/http:/bin/false
    dbus:x:81:81:System message bus:/:/bin/false
    hal:x:82:82:HAL daemon:/:/bin/false
    mysql:x:89:89::/var/lib/mysql:/bin/false
    aaa:x:1001:1001::/home/aaa:/bin/bash
    ba:x:1002:1002::/home/zhangy:/bin/bash
    test:x:1003:1003::/home/test:/bin/bash
    @zhangying:*:1004:1004::/home/test:/bin/bash
    policykit:x:102:1005:Po
    EOF
    
  2. 用模式匹配指定行,执行处理命令。

示例

示例 1:打印包含特定字符串的行
格式:/字符串/p(配合 -n 只打印匹配行)。

# 打印包含 "zhang" 的行
[bq@shell ~]$ sed -n '/zhang/p' test
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash

示例 2:打印模式范围的行
格式:/模式1/,/模式2/p(从匹配模式 1 的行开始,到匹配模式 2 的行结束)。

# 打印从 "root开头" 的行到 "mail开头" 的行
[bq@shell ~]$ sed -n '/^root/,/^mail/p' test  # ^ 表示行首
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false

示例 3:混合行号和模式
格式:/模式/,行号p行号,/模式/p

# 打印从 "root开头" 的行到第3行
[bq@shell ~]$ sed -n '/^root/,3p' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false

sed 核心子命令

打印命令(p/P)
  • p:打印 pattern space 中的所有内容(整行或多行)。
  • P:只打印 pattern space 中的第一行(如果有多行的话)。

实验流程
N 命令将两行合并到 pattern space,分别用 pP 观察输出差异。

# 准备输入(3行文本)
[bq@shell ~]$ echo -e 'This is 1\nThis is 2\nThis is 3' > test_p# 1. 用 N 合并第1行和第2行,p 打印所有内容
[bq@shell ~]$ sed -n '1{N;p}' test_p  # 1:只处理第1行;N:追加下一行到 pattern space;p:打印所有
This is 1
This is 2  # 输出两行# 2. 同样合并,P 只打印第一行
[bq@shell ~]$ sed -n '1{N;P}' test_p
This is 1  # 只输出第一行
读取下一行(n/N)
  • n:读取下一行,覆盖当前 pattern space 中的内容(当前行会被输出,除非用 -n)。
  • N:读取下一行,追加到当前 pattern space 中(两行之间保留换行符,视为一个整体处理)。

实验 1:用 n 打印偶数行
原理:n 会跳过当前行(输出下一行),配合 -np 只打印偶数行。

[bq@shell ~]$ echo -e '1\n2\n3\n4\n5' | sed -n 'n;p'
2  # 第2行
4  # 第4行

实验 2:用 N 合并行
将相邻两行合并,用 == 替换换行符。

# 合并 test 文件的相邻行
[bq@shell ~]$ sed 'N;s/\n/==/' test  # N:合并两行;s/\n/==/:换行符换成 ==
root:x:0:0:root:/root:/bin/bash==bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false==mail:x:8:12:mail:/var/spool/mail:/bin/false
...  # 后续行同理
替换命令(s)

最常用的命令之一,格式:s/原内容/新内容/选项
常用选项:

  • g:全局替换(一行中所有匹配都替换,默认只替换第一个)。
  • 数字:只替换第 N 个匹配(比如 s/my/your/3 替换第 3 个 my)。
  • p:配合 -n 只打印发生替换的行。

实验流程
准备测试文件 test1.txt,执行不同替换命令,观察结果。

# 准备测试文件(每行5个 my)
[bq@shell ~]$ echo -e 'my my my my my\nmy my my my my\nmy my my my my' > test1.txt

示例

# 1. 只替换每行第1个 my(默认行为)
[bq@shell ~]$ sed 's/my/your/' test1.txt
your my my my my
your my my my my
your my my my my# 2. 全局替换(每行所有 my 都替换)
[bq@shell ~]$ sed 's/my/your/g' test1.txt
your your your your your
your your your your your
your your your your your# 3. 只替换每行第3个 my
[bq@shell ~]$ sed 's/my/your/3' test1.txt
my my your my my
my my your my my
my my your my my# 4. 替换第3行的第1个 my
[bq@shell ~]$ sed '3s/my/your/1' test1.txt  # 3:只处理第3行
my my my my my
my my my my my
your my my my my# 5. 只打印发生替换的行(配合 -n 和 p)
[bq@shell ~]$ sed -n 's/my/your/p' test1.txt  # 只输出替换了第1个 my 的行
your my my my my
your my my my my
your my my my my
删除命令(d/D)
  • d:删除 pattern space 中的所有内容(整行或多行)。
  • D:只删除 pattern space 中的第一行(如果有多行)。

实验 1:用 d 删除指定行

# 1. 删除第1-14行(保留剩余行)
[bq@shell ~]$ sed '1,14d' test
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po# 2. 删除第4行到最后一行(保留前3行)
[bq@shell ~]$ sed '4,$d' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false# 3. 删除包含 false 或 bash 的行(用扩展正则)
[bq@shell ~]$ sed -r '/(false|bash)/d' test  # -r 支持 (|) 表示“或”
policykit:x:102:1005:Po

实验 2:用 D 删除多行中的第一行

# 输入5行文本,用 N;D 最终只保留最后一行
[bq@shell ~]$ echo -e '1\n2\n3\n4\n5' | sed 'N;D'
5  # 原理:每次合并两行后删除第一行,最后只剩最后一行# 删除偶数行(保留奇数行)
[bq@shell ~]$ echo -e '1\n2\n3\n4\n5' | sed 'n;D'
1
3
5  # 原理:n 读取下一行(偶数行),D 删除偶数行,保留奇数行
插入命令(i/a)
  • i:在匹配行的上方插入内容。
  • a:在匹配行的下方插入内容。

示例

# 在包含 root 的行上方插入 "=====before====="
[bq@shell ~]$ sed '/root/i=====before=====' test
=====before=====
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
...# 在包含 root 的行下方插入 "=====after====="
[bq@shell ~]$ sed '/root/a=====after=====' test
root:x:0:0:root:/root:/bin/bash
=====after=====
bin:x:1:1:bin:/bin:/bin/false
...
行首 / 行尾插入

通过替换命令 s 实现:

  • 行首插入:s/^/要插入的内容/^ 表示行首)。
  • 行尾插入:s/$/要插入的内容/$ 表示行尾)。

示例

# 给 test 文件每行开头加 "LINE: "
[bq@shell ~]$ sed 's/^/LINE: /' test
LINE: root:x:0:0:root:/root:/bin/bash
LINE: bin:x:1:1:bin:/bin:/bin/false
...# 给 test 文件每行结尾加 " ---"
[bq@shell ~]$ sed 's/$/ ---/' test
root:x:0:0:root:/root:/bin/bash ---
bin:x:1:1:bin:/bin:/bin/false ---
...
大小写转换(y)

格式:y/原字符集/目标字符集/(按位置一对一转换,原字符集中的每个字符对应目标字符集中的相同位置字符)。

示例

# 将 "s" 转成 "S","i" 转成 "I"
[bq@shell ~]$ echo 'This is a test' | sed 'y/si/SI/'
ThIS IS a teSt  # s→S,i→I
保存和读取(h/H/g/G)

涉及 pattern space(工作台)和 hold space(储物柜)的交互:

  • h:将 pattern space 内容覆盖到 hold space
  • H:将 pattern space 内容追加到 hold space(加换行符)。
  • g:将 hold space 内容覆盖到 pattern space
  • G:将 hold space 内容追加到 pattern space(加换行符)。

示例 1:在文件最后追加包含 root 的行

# 1. 用 h 把 root 行存到 hold space;2. 用 $G 把 hold space 内容追加到最后一行
[bq@shell ~]$ sed -e '/root/h' -e '$G' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
...  # 中间行省略
policykit:x:102:1005:Po
root:x:0:0:root:/root:/bin/bash  # 最后一行追加了 root 行

示例 2:用 root 行替换所有 zhangy 行

# 1. 用 h 保存 root 行到 hold space;2. 用 g 把 hold space 内容覆盖到 zhangy 行
[bq@shell ~]$ sed -e '/root/h' -e '/zhangy/g' test
root:x:0:0:root:/root:/bin/bash
...  # 中间行省略
root:x:0:0:root:/root:/bin/bash  # 原 zhangy 行被替换
...  # 后续行中 zhangy 行也被替换

多命令执行(;/{}/-e)

当需要执行多个命令时,可以用以下方式:

  • 分号 ;:在同一行分隔命令。
  • 大括号 {}:将多个命令组合(适合多行命令)。
  • -e 选项:多次指定命令。

示例

# 用分号分隔:删除第1行,替换 root 为 admin
[bq@shell ~]$ sed '1d;s/root/admin/' test
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
...  # 第1行已删除,其他行 root 被替换为 admin# 用大括号组合(适合多行命令)
[bq@shell ~]$ sed '
1d  # 删除第1行
s/root/admin/  # 替换 root 为 admin
' test  # 效果同上# 用 -e 多次指定
[bq@shell ~]$ sed -e '1d' -e 's/root/admin/' test  # 效果同上

退出命令(q)

处理到指定行后直接退出,不再处理后续内容(提高效率)。

示例

# 处理到第2行后退出(只输出前2行)
[bq@shell ~]$ sed '2q' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false

取反命令(!)

对 “未匹配指定条件” 的行执行命令(即 “除了这些行之外的所有行”)。

示例

# 打印所有不包含 root 的行(取反匹配)
[bq@shell ~]$ sed -n '/root/!p' test  # ! 表示“不匹配”
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
...  # 所有不含 root 的行

正则表达式在 sed 中的使用

sed 支持正则表达式,用于精准匹配文本。常用规则:

  • ^:行首(如 ^root 匹配以 root 开头的行)。
  • $:行尾(如 bash$ 匹配以 bash 结尾的行)。
  • .:任意单个字符(如 r..t 匹配 root、rbat 等)。
  • *:前面的字符出现 0 次或多次(如 ro* 匹配 r、ro、roo 等)。
  • []:字符集(如 [0-9] 匹配任意数字)。
  • ():捕获子串(配合 \1\2 引用,需要 -r 选项避免转义)。
  • |:逻辑 “或”(需要 -r 选项)。

示例

# 1. 捕获子串:提取用户名和shell(用 () 捕获,\1 引用第一个子串,\2 引用第二个)
[bq@shell ~]$ sed -nr 's/^([^:]+):.*:([^:]+)$/\1 -> \2/p' test  # -r 支持 ()
root -> /bin/bash
bin -> /bin/false
...  # 格式:用户名 -> shell路径# 2. 替换匹配的整行(用 & 表示匹配的所有内容)
[bq@shell ~]$ sed -n 's/^root.*/USER: &/p' test  # & 代表匹配的整行
USER: root:x:0:0:root:/root:/bin/bash

列表命令(l)

打印文本的详细信息(包括不可见字符,如换行符 $),用于调试。

示例

# 显示 test 文件第一行的详细信息($ 表示换行符)
[bq@shell ~]$ sed -n '1l' test
root:x:0:0:root:/root:/bin/bash$

总结

sed 是一款强大的流编辑器,核心是 “一行一行处理文本”,通过各种命令实现替换、删除、插入等操作。关键是理解 pattern spacehold space 的作用,以及如何通过行寻址或模式寻址精准指定处理范围。熟练掌握后,能大幅提高文本处理效率。
引用,需要 -r 选项避免转义)。

  • |:逻辑 “或”(需要 -r 选项)。

示例

# 1. 捕获子串:提取用户名和shell(用 () 捕获,\1 引用第一个子串,\2 引用第二个)
[bq@shell ~]$ sed -nr 's/^([^:]+):.*:([^:]+)$/\1 -> \2/p' test  # -r 支持 ()
root -> /bin/bash
bin -> /bin/false
...  # 格式:用户名 -> shell路径# 2. 替换匹配的整行(用 & 表示匹配的所有内容)
[bq@shell ~]$ sed -n 's/^root.*/USER: &/p' test  # & 代表匹配的整行
USER: root:x:0:0:root:/root:/bin/bash

列表命令(l)

打印文本的详细信息(包括不可见字符,如换行符 $),用于调试。

示例

# 显示 test 文件第一行的详细信息($ 表示换行符)
[bq@shell ~]$ sed -n '1l' test
root:x:0:0:root:/root:/bin/bash$

总结

sed 是一款强大的流编辑器,核心是 “一行一行处理文本”,通过各种命令实现替换、删除、插入等操作。关键是理解 pattern spacehold space 的作用,以及如何通过行寻址或模式寻址精准指定处理范围。熟练掌握后,能大幅提高文本处理效率。

如涉及版权问题,请联系作者处理!!!!

http://www.dtcms.com/a/342907.html

相关文章:

  • HarmonyOS 实战:6 种实现实时数据更新的方案全解析(含完整 Demo)
  • JavaScript中的深浅拷贝
  • Llama-Factory微调 Qwen2.5-VL-3B 模型
  • 人工智能未来趋势如何?
  • 【秋招笔试】2025.08.19百度秋招机考第一套
  • 算法训练营day57 图论⑦ prim算法精讲、kruskal算法精讲
  • 前端无感刷新 Token 的 Axios 封装方案
  • Github 下载加速--2025-08-21 亲测好用
  • 神经网络(Neural Network, NN)
  • gemini cli 用命令行玩转 AI 多模态开发
  • 网络安全大模型测试指标体系设计思路
  • 我与 ChatGPT 5:一段时间的深度编程体验与全栈评测
  • Zabbix状态图标灯显示
  • K8s部署dashboard平台和基本使用
  • MySQL:MVCC机制及其在Java秋招中的高频考点
  • AutoTrack-IR-DR200平台的构建与实现过程
  • python采集义乌购(yiwugo)商品详情API接口,json数据返回
  • 透射TEM 新手入门:快速掌握核心技能
  • 【每日一道算法题 day5】盛最多水的容器 (Container With Most Water) - LeetCode 题解
  • 深度学习之NLP基础
  • 【React】tab切换功能和排序实现,classnames工具优化类名控制
  • Java基础环境jdk和maven安装及配置+开源项目下载及编译打包教程
  • Flutter如何通过GlobalKey调用组件内的方法
  • 微服务的编程测评系统13-我的竞赛列表-elasticSearch
  • 与H5交互,与flutter的交互
  • 求解三位数
  • 深度解析DeepSeek V3.1 :6850 亿参数开源模型如何以 71.6% 编码得分、68 倍成本优势重构全球 AI 竞争格局
  • 使用postman模拟http请求webservice服务
  • 企业如何用外贸进销存系统管理好库存产品?
  • Docker安装elasticsearch以及Kibana、ik分词器