提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
前言
依赖正则表达式,读取文件内容,更具条件进行操作,我们可以用sed命令来操作
一、sed是什么?
sed是一种流编辑器,会在数据处理之前基于预先提供的一组规则来编辑数据流
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令中输入,要么存储在一个命令文本文件中
二、学习步骤
1.工作流程
读取 sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中
执行 在默认情况下,所有sed命令都在缓冲区中进行顺序的执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
显示 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成前,上述过程将重复执行直到处理完
注意:sed的所有命令都是在缓存区进行的,并不修改文件,除非用i选项或重定向等
2.命令格式
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
语法 | sed [选项] '编辑指令' 文件1 文件2 | sed -e '编辑指令' 文件1 文件2 ... |
sed [选项] -f scriptfile 文件1 文件2 | 也可以用-f 来调用脚本来处理文件 |
选项 | -e | 指定要执行的命令或脚本,一个时可以省略 |
-n | 禁止输出,加上p后只输出处理后的行,读入时不显示 | |
-i | 直接编辑文本文件 | |
指令 | p | 输出指定行 |
a | 增加,在当前行下面增加一行指定内容 | |
c | 替换,将选定行替换为指定内容 | |
d | 删除,删除选定的行 | |
y | 字符转换 类似s,但必须目标和源字符长度相同 | |
s | 替换,替换指定字符 | |
r | 支持正则表达式 读取指定文件。 | |
w | 保存为文件 | |
i | 插入,在当前行前面插入 | |
= | 打印行号 | |
l | 打印数据流中的文本文件和不可打印的ASCII字符,$结束符,\t |
3.用法示例
输出指定行 | sed -n 'p' /etc/passwd | 输出所有行 $p 末行 |
sed -n '6p' /etc/passwd | 输出第6行 | |
sed -n '6,8p' /etc/passwd | 输出第6-8行 | |
sed -n 'p;n' /etc/passwd | 输出所有奇数行 | |
sed -n 'n;p' /etc/passwd | 输出所有偶数行 | |
sed -n '2,10{p;n}' /etc/passwd | 输出第2-10行的所有奇数行 第2行作为第一行,是奇数行 | |
sed -n '2,${p;n}' /etc/passwd | 输出第2到末行的所有奇数行 第2行作为第一行,是奇数行 | |
sed -n '2,+4p' /etc/passwd | 第2行开始连续输出4行 2-6行 | |
sed -n '/root/p' /etc/passwd | 匹配包含字符串root的行 如 aroot 匹配 | |
sed -n '/\<root\>/p' /etc/passwd | 匹配包含单个字符串是root的行 如 aroot 则不匹配 | |
sed -n '10,/root/p' /etc/passwd | 匹配第10行开始(不含10行但会输出)到下一个包含root的所有行 | |
sed -nr '/ro{1,}t/p' /etc/passwd | 匹配不少于一次前导字符o,加-r参数 | |
sed -nr '/root|ntp/p' /etc/passwd | 匹配包含root或ntp的行 | |
sed -n '/root/=' /etc/passwd | 包含root的行的行号输出 = 用来输出行号 | |
sed -e '5q' /etc/passwd | 输出前5行信息后q退出 | |
sed -n '/^PI/p' test.txt | ||
sed -n '/[0-9]$/p' test.txt |
插入指定行 | sed '/12/i 123123' 222 | 在所有含12的行前面插入一行123123 |
sed '/12/a 123123' 222 | 在所有含12的行下面插入一行123123 | |
sed '/12/i 123123\n33333' 222 | 插入多行时用\n来表示换行 |
删除指定行 | nl test.txt | sed '3d' 或 sed '3d' /test.txt | 删除第 3 行 |
nl test.txt | sed '3,5d' | 删除第 3~5 行 | |
nl test.txt |sed '/cross/d' | 删除包含 cross 的行 '/cross/!d'取反 | |
sed '/^[a-z]/d' test.txt | //删除以小写字母开头的行 | |
sed '/\.$/d' test.txt | 删除以"."结尾的行 | |
sed '/^$/d' test.txt | 删除所有空行 | |
sed '/2/,/3/d' test.txt | 从第一个位置打开删除,到第二个位置结束删除,若后面还有2,则继续执行 |
替换指定文本 | 在使用 sed 命令进行替换操作时需要用到 s(字符串替换)、c(整行/整块替换)、y(字符转换)命令选项 | |
行范围 s/旧字符串/新字符串/替换标记 | ||
四种替换标记 | 数字 | 表明新字符串将替换第几次匹配的地方,默认替换第一个 |
g | 表明新字符串将替换所有匹配的地方 | |
p | 打印与替换命令匹配的行,与-n一起使用 | |
w | 文件,将替换的结果写到文件中 | |
sed 's/the/THE/' test.txt | //将每行中的第一个the 替换为 THE | |
sed 's/l/L/2' test.txt | 将每行中的第 2 个 l 替换为 L | |
sed 's/the/THE/g' test.txt | 将文件中的所有the 替换为 THE | |
sed 's/o//g' test.txt | 将文件中的所有o 删除(替换为空串) | |
sed 's/^/#/' test.txt | 在每行行首插入#号 | |
sed '/the/s/^/#/' test.txt | 在包含the 的每行行首插入#号 | |
sed 's/$/EOF/' test.txt | 在每行行尾插入字符串EOF | |
sed '3,5s/the/THE/g' test.txt | 将第 3~5 行中的所有 the 替换为 THE | |
sed '/the/s/o/O/g' test.txt | 将包含the 的所有行中的 o 都替换为 O | |
多条要求同时执行 | sed -n -e '/145/=;/145/p' text | sed -n -e '/145/=' -e '/145/p' text |
sed '1,20w out.txt' /etc/passwd | ||
sed '1,20 s/^/#/w out.txt' /etc/passwd | ||
sed '/45/c ABC' test | 整行替换 | |
sed '/45/ y/45/AB/' test | 指定字符替换,源与目标长度要一致 | |
sed '$a ABC' test | 在末行$前一行插入 | |
sed '1i ABC' test | 第1行下面插入 | |
sed '5r /etc/sesolv.conf' test.txt | 将/etc/sesolv.conf文件所有行插入目标文档的第5行下面 | |
sed '/root/{H;d};$G /etc/passwd | 将包含root的行剪切到末行,H复制到剪切板,G粘贴到指定行后 | |
sed '1,5H;15,16G' /etc/passwd | 将1-5行复制粘贴到第15行和16行后面。 |
总结
sed命令基本可以满足大部分的,对行进行操作的要求。若想过滤出行里面的具体内容,得需要用到其它的工具,如awk、grep等