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 从输入源(可以是文件、管道、键盘输入)中读取一行文本,存到内存中的一个临时空间,这个空间叫做pattern space
(可以理解为 “工作台”,专门放当前正在处理的内容)。
同时,sed 会记录当前处理的是第几行(行号计数器)。 - 执行命令
按照我们给的 sed 命令,对pattern space
里的这一行文本进行处理(比如替换、删除等)。
默认情况下,sed 会处理所有行;但如果我们指定了行号(比如只处理第 3 行),就只会处理指定的行。 - 显示结果
处理完后,把pattern space
里的内容输出到目标(可以是屏幕、文件、管道),然后清空这个 “工作台”,准备处理下一行。 - 重复上面的步骤,直到所有输入内容都处理完。
sed 注意事项
虽然流程简单,但有几个关键概念需要理解:
pattern space
(工作台):是内存中的临时区域,只存当前正在处理的行,处理完就清空。因为是内存中的数据,关闭终端或关机后就没了。- 默认不修改源文件:sed 处理的是
pattern space
里的副本,不会直接改原文件。如果想直接修改原文件,GNU sed 提供了-i
选项(后面会详细说)。 hold space
(储物柜):内存中另一个临时区域,用来存放暂时不用的数据(比如处理到后面需要用到前面的行)。和pattern space
不同,它不会自动清空,除非手动操作。- 初始状态:
pattern space
和hold 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 部分组成:
sed
:命令本身。[选项]
:改变 sed 工作方式的参数(比如-n
、-i
等)。[sed命令]
:具体的处理动作(比如替换、删除等)。[输入文件]
:要处理的文件,不指定则从键盘输入。
基础示例
示例 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 行)。
实验流程(以打印行为例)
-
准备测试文件
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
-
执行不同的行寻址命令,观察输出。
示例
示例 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 模式寻址(按内容匹配行)
除了行号,还可以通过 “内容模式”(字符串或正则表达式)指定要处理的行,格式为 /模式/
。
实验流程
-
准备测试文件
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
-
用模式匹配指定行,执行处理命令。
示例
示例 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
,分别用 p
和 P
观察输出差异。
# 准备输入(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
会跳过当前行(输出下一行),配合 -n
和 p
只打印偶数行。
[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 space
和 hold 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 space
和 hold space
的作用,以及如何通过行寻址或模式寻址精准指定处理范围。熟练掌握后,能大幅提高文本处理效率。
如涉及版权问题,请联系作者处理!!!!