sed用法小记

SED是什么?

sed:Stream EDitor 流编辑器

SED是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。——–百度百科

sed命令与grep、awk并称linux字符处理三剑客。
它主要是对行的内容进行处理,对指定字符数据按照指定的脚本规则进行处理并输出。


命令使用格式:
sed [option] 'script' inputfile

常用选项表

命令选项用途
-n:不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑
-f: /PATH/SCRIPT_FILE:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i.bak:备份文件并原处编辑

SCRIPT脚本

功能模块功能描述
地址定界(1) 不给地址:对全文进行处理
(2) 单地址:#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
编辑命令:d: 删除模式空间匹配的行
p: 显示模式空间中的内容
a [\]text:在指定行后面追加文本
支持使用\n实现多行追加
i [\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///s///:查找替换,支持使用其它分隔符, s@@@, s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

示例

sed ‘2p’ /etc/passwd 打印第二行两次
sed –n ‘2p’ /etc/passwd 只打印第二行
sed –n ‘1,4p’ /etc/passwd 打印1 4行
sed –n ‘/root/p’ /etc/passwd 带root行打印
sed –n ‘2,/root/p’ /etc/passwd 从2行开始
sed -n ‘/^$/=’ file 显示空行行号
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 显示空行并打印行号
sed ‘/root/a\superman’ /etc/passwd 行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
sed ‘/^$/d’ file 删除空白行
sed ‘1,10d’ file 删除1,10行
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’第二行后增加文本tea
sed ‘s/test/mytest/g’ example 文本中字符串test替换成mytest
sed –n ‘s/root/&superman/p’ /etc/passwd 单词后
sed –n ‘s/root/superman&/p’ /etc/passwd 单词前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets pets文件中,dog替换成cat,hi替换成lo
sed –i.bak ‘s/dog/cat/g’ pets 把原文件创建备份后替换

高级用法

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

高级用法解释:

这里写图片描述

sed有模式空间和保持空间,普通模式使用模式空间处理,高级模式在模式空间和保持空间协作处理。

高级语法示例:

sed -n ‘n;p’ FILE 显示偶数行
sed ‘1!G;h;$!d’ FILE 倒序显示
sed -n ‘1!G;h;$p’ 倒序显示
seq 7 |sed ‘n;d’ 显示奇数
sed ‘N;D’ 显示最后一行
sed ‘$!d’ 显示最后一行
sed ‘G’ 每行之间加空行
sed ‘g’ 把每行内容替换成空行
sed ‘/^$/d;G’ 确保每一行下面都有一个空行

实例操作

1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头
的行行首的空白字符

cat grub2.cfg |sed -r 's/^[[:space:]]+//'

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空
白字符的行的行首的#和空白字符

sed -r "/^#[[:space:]]/s/^#[[:space:]]+([^[:space:]])/\1/" fstab
sed -r 's/^#[[:space:]]+//' fstab

3、在centos6系统/root/install.log每一行行首增加#号

sed 's/^/#/g' /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号

cat /etc/fstab |sed  's/^[^#]/#&/'

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

echo /etc/sysconfig/network-scripts/ |sed -r  's#(^/.*/)([^/].*/?$)#a:\1\nb:\2#'

6、利用sed 取出ifconfig命令中本机的IPv4地址

ifconfig eth0 |sed -n '2p' |sed 's#^.*addr:##g' |sed 's#  Bcas.*$##g'
ifconfig eth0 |sed  -n -e  '2s#^.*addr:##g' -e 's#  Bcas.*$##gp'

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

ls /media/Packages/*.rpm|sed -r -e 's/\.rpm$//g' -e 's/.*\.\<//g'|sort -nr|uniq -c  

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

egrep -o "[[:alpha:]]+" /etc/init.d/functions|sort -nr |uniq -c
sed -r -e "s/([[:alpha:]]+)/\n\1\n/g" -e 's/[^[[:alpha:]]\n]*//g' /etc/init.d/functions  (半成品)

9、将文本文件的n和n+1行合并为一行,n为奇数行

seq 10|sed 'N;s/\n//g'

总结

有关两个空间的高级用法,需要大家去自习揣摩,慢慢分析。相信你们可以完全掌握它~

<think>嗯,用户想了解sed工具的使用方法,之前系统已经提供了一些引用资料。我需要整合这些信息,给用户一个清晰实用的sed指南。 用户可能是个Linux新手管理员,或者正在写脚本需要文本处理。ta直接要"使用方法",说明需要实操指导而非理论。从引用看,sed的核心是逐行处理、模式匹配和命令操作。 首先得解释基本原理,否则用户会迷惑为什么sed命令这么写。引用[4]的工作流程描述很关键:逐行加载、内存处理、输出结果。这个必须放在开头讲清楚,避免用户误以为直接修改文件。 常用选项部分要突出"-i"和"-n"这两个最易出错的点。用户常忘记"-i"导致文件没改,或者没用"-n"却奇怪为什么多输出内容。引用[2]提到默认不修改文件这点很重要。 命令格式的说明要拆解:选项、脚本、文件三部分。引用[1]的格式模板很好,但需要补充例子说明"address+command"的组合逻辑,比如"2d"是地址2加删除命令。 命令类型按增删改查分类最直观。引用[5]的删除操作例子很全,但需要补充插入和替换的典型用法。这里特别要注意定界符转义的问题,很多人被/符号坑过。 正则表达式部分单独成节比较好,因为sed的强大正在于此。要强调元字符如^$.*[]的用法,但避免太深入以免 overwhelm 用户。 最后必须包含安全提示!很多新手直接"-i"把文件搞坏。建议先输出到临时文件,或者用"--in-place=backup"备份。这个在引用里没提,但实际工作特别重要。 测试建议也很关键。用户可能不知道可以用管道测命令,或者忘了用tail -f监控日志。这些实战技巧比手册更有价值。 相关问题设计成进阶路线:从应用场景(日志处理)到高级功能(多命令组合),最后到调试技巧。这样用户学完基础自然知道下一步学什么。 </think>好的,以下是关于 `sed` (Stream Editor) 工具使用方法的清晰总结,整合了您提供的引用信息: **sed 工具核心概念与使用方法** `sed` 是一个强大、非交互式的**流式文本编辑器**。它逐行处理输入(文件或标准输入流),根据预设的规则(脚本)进行修改(查找、替换、删除、插入等),并将结果输出(默认到标准输出)。**其核心工作原理是:** 1. **逐行读取**:`sed` 依次读取输入文件的每一行内容到内存中(称为“模式空间”)。 2. **规则匹配与应用**:对于读入的每一行,它检查是否匹配脚本中指定的地址(行号或正则表达式)和命令。如果匹配,则应用相应的命令(如替换、删除、打印等)。 3. **输出结果**:处理完当前行后(无论是否修改),`sed` 默认会将模式空间的内容输出(通常是标准输出)。 4. **非原地修改**:**默认情况下 `sed` 不会直接修改原始文件**。它只是将处理后的结果显示出来。如果需要修改原文件,必须使用 `-i`(或 `--in-place`)选项[^2][^4][^5]。 5. **脚本驱动**:所有操作指令都写在传递给 `sed` 的“脚本”(`script`)参数中。 **一、基本命令格式** ```bash sed [选项] '脚本命令' [输入文件...] ``` * **`[选项]`** (常用): * `-e 'script'` / `--expression='script'`:添加脚本命令。可以多次使用以执行多个命令。 * `-f scriptfile` / `--file=scriptfile`:从指定文件中读取脚本命令。 * `-i[SUFFIX]` / `--in-place[=SUFFIX]`:**直接修改原文件**。如果提供 `SUFFIX`,则会创建以该后缀命名的备份文件(强烈建议使用备份,例如 `-i.bak`)[^2][^5]。 * `-n` / `--quiet` / `--silent`:**抑制默认输出**。通常与 `p` (print) 命令一起使用,只输出显式要求打印的行[^2][^5]。 * `-r` / `-E` / `--regexp-extended`:使用扩展正则表达式(ERE)而非基础正则表达式(BRE)。功能更强大,推荐使用。 * **`'脚本命令'`**:核心部分,由地址(可选)+ 命令组成: * **地址 (Address)**: 指定命令作用于哪些行。省略则表示作用于所有行。 * `n`:明确的行号(如 `5` 表示第5行)。 * `$`:最后一行。 * `n,m`:行号范围(如 `2,5` 表示第2到第5行)。 * `/regex/`:匹配正则表达式 `regex` 的行(如 `/^root/` 匹配以 `root` 开头的行)。 * `n~m`:从第 `n` 行开始,每隔 `m` 行匹配一次(如 `1~2` 匹配所有奇数行)。 * 地址后加 `!` 表示取反(如 `5!d` 表示删除除了第5行以外的所有行)。 * **命令 (Command)**: 对匹配行执行的操作(常用): * `s/regex/replacement/flags`:**替换 (Substitute)**。查找匹配 `regex` 的部分,用 `replacement` 替换。 * `flags`: * `g`:全局替换(一行中所有匹配项)。 * `p`:如果替换发生,则打印该行(常与 `-n` 连用)。 * `i` 或 `I`:忽略大小写匹配。 * `w file`:将成功替换的行写入文件 `file`。 * **定界符**:通常使用 `/`,但如果 `regex` 或 `replacement` 中包含 `/`,可以用其他字符(如 `:`, `|`, `#`)转义或替代(如 `s|/old/path|/new/path|g`)[^5]。 * `d`:**删除 (Delete)** 匹配的行(这些行不会被输出)。 * `p`:**打印 (Print)** 匹配的行(常与 `-n` 连用)。 * `a \text`:**在匹配行之后追加 (Append)** 文本 `text`。 * `i \text`:**在匹配行之前插入 (Insert)** 文本 `text`。 * `c \text`:**更改/替换 (Change)** 匹配的行(整行替换)为文本 `text`。 * `r file`:**读取文件 (Read)** 的内容,并将其插入到匹配行之后。 * `w file`:**写入文件 (Write)** 将匹配的行写入到文件 `file`。 * `q [exit-code]`:**读取完退出 (Quit)** 处理完匹配行后立即退出 `sed`(可选退出码)。 * **`[输入文件...]`**:要处理的文件。可以指定多个文件。省略则从标准输入读取。 **二、常用操作示例** 假设我们有一个文件 `test.txt`。 1. **查看/选择行:** * 查看第3行:`sed -n '3p' test.txt` * 查看第2到第5行:`sed -n '2,5p' test.txt` * 查看包含 "error" 的行:`sed -n '/error/p' test.txt` * 查看空白行:`sed -n '/^$/p' test.txt` (或 `-n '/^\s*$/p'` 匹配空或仅含空白符的行) 2. **删除行:** * 删除空白行:`sed '/^$/d' test.txt` * 删除第2行:`sed '2d' test.txt` * 删除第2行到最后一行:`sed '2,$d' test.txt` * 删除最后一行:`sed '$d' test.txt` * 删除所有以 "root" 开头的行:`sed '/^root/d' test.txt` * 删除所有包含 "debug" 的行:`sed '/debug/d' test.txt` * 删除奇数行(显示偶数行):`sed '1~2d' test.txt` 或 `sed -n '2~2p' test.txt` 3. **替换文本:** * 将文件中所有 `old` 替换为 `new`:`sed 's/old/new/g' test.txt` * 仅替换每行第一个 `old`:`sed 's/old/new/' test.txt` (省略 `g`) * 将 `/usr/local/bin` 替换为 `/opt/bin`:`sed 's|/usr/local/bin|/opt/bin|g' test.txt` (使用 `|` 作定界符避免转义 `/`) * 忽略大小写替换:`sed 's/hello/world/gi' test.txt` (将 `hello`, `Hello`, `HELLO` 等替换为 `world`) * 替换并只打印发生替换的行:`sed -n 's/old/new/p' test.txt` 4. **插入/追加/更改行:** * 在第3行前插入一行 "This is inserted":`sed '3i \This is inserted' test.txt` * 在第3行后追加一行 "This is appended":`sed '3a \This is appended' test.txt` * 将包含 "oldtext" 的行整行替换为 "newtext":`sed '/oldtext/c \newtext' test.txt` 5. **写入/读取文件:** * 将所有包含 "important" 的行写入 `notes.txt`:`sed -n '/important/w notes.txt' test.txt` * 在文件末尾插入另一个文件的内容:`sed '$r anotherfile.txt' test.txt` 6. **多点编辑 (多个命令):** * 删除空白行 *并* 将所有 `foo` 替换为 `bar`:`sed -e '/^$/d' -e 's/foo/bar/g' test.txt` * 使用分号分隔命令:`sed '/^$/d; s/foo/bar/g' test.txt` 7. **修改原文件 (务必谨慎!):** * 删除空白行并直接修改原文件(无备份):`sed -i '/^$/d' test.txt` * 删除空白行并修改原文件,同时创建备份 `test.txt.bak`:`sed -i.bak '/^$/d' test.txt` **三、关键提示与最佳实践** 1. **理解默认输出**:除非使用 `-n`,否则 `sed` 会输出模式空间的最终内容(无论是否修改)。 2. **`-i` 选项危险性**:`-i` 会直接覆盖原文件。**强烈建议始终使用带后缀的 `-i.bak` 形式进行备份**,尤其是在重要文件操作前[^2][^4][^5]。 3. **正则表达式**:`sed` 的强大源于正则表达式。熟练掌握正则(BRE 或 ERE)是高效使用 `sed` 的关键[^1][^3][^5]。 4. **地址范围**:地址可以是单一地址(行号/正则)或地址范围(`start,end`)。地址范围非常灵活,如 `/start/,/end/` 表示从一个匹配行 `start` 到下一个匹配行 `end` 之间的所有行。 5. **脚本文件**:对于复杂操作,将多条 `sed` 命令写入一个文件(如 `script.sed`),然后使用 `-f script.sed` 执行更清晰。 6. **测试**:**在进行文件原位修改 (`-i`) 之前,务必在不加 `-i` 的情况下运行命令**,确认输出结果符合预期。 **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值