sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。
sed命令的语法格式
sed的命令格式: sed [option] 'sed command' filename 或 sed [option] "sed command" filename
sed里单引号和双引号的区别:双引号里可以使用shell里的变量,单引号不能;单引号和双引号里都可以存放模式。
sed的脚本格式:sed [option] -f 'sed script' filename
sed命令的选项(option):
--help :命令帮助
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容
sed在文件中查询文本的方式-寻址方式adress
使用行号,可以是一个简单数字,或是一个行号范围
x | x为行号 | sed -n '3p' text.txt |
x,y | 表示行号从x到y | sed -n '1,3p' text.txt |
/pattern/ | 查询包含模式的行 | sed -n '/This/p' text.txt |
/pattern/{/pattern/} | 查询包含两个模式的行 | sed -n '/This/{/is/p}' text.txt |
/pattern/,x | 在给定行号上查询包含模式的行 | sed -n '/That/,3p' text.txt |
x,/pattern/ | 通过行号和模式查询匹配的行 | sed -n '2,/They/p' text.txt |
x,y! | 查询不包含指定行号x和y的行 |
默认情况下,sed 命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须写明 address 部分,表示的方法有以下 2 种:
- 以数字形式指定行区间;
- 用文本模式指定具体行区间。
以上两种形式都可以使用如下这 2 种格式,分别是:
[address]脚本命令
或者
address {
多个脚本命令
}
sed的编辑命令(sed command):
直接命令来展示示例:text.txt的内容如下
This is the first line.content:1
This is the second line.content:2
This is the third line.3
this is the fourth.4
命令 | 意义 | 规则格式 | 示例(所有的命令,只有在加入 -i 参数之后才会直接对文件修改,否则只是会打印在控制台上,并不会对文件做修改。) |
p | 打印所有行(和-n选项一起合用表示打印匹配行) | sed '[adress]p' filename | sed '2p' text.txt :打印所有行,第二行打印两遍。sed 'p' text.txt :打印所有行,每行打印两遍。sed -n '2p' text.txt :打印第二行, sed -n 'p' text.txt :打印每一行 |
P | (大写) 打印模板块的第一行。 | ||
= | 显示文件行号 | sed '[adress]=' filename | sed '=' text.txt :每行都打印行号和内容。sed '2=' text.txt :打印第二行的行号和内容 |
a\ | 在定位行号后的新一行附加新文本信息,相当于增加一行。 | sed '[adress]a [content]' filename 或 sed '[adress]a\[content]' filename 或 sed '[adress] a\[content]' filename | sed '3 a\addcontent' text.txt 或 sed '3 a\addcontent' text.txt 或 sed '3a addcontent' text.txt :在三行后的加入一行(第四行)文本addcontent |
i\ | 在定位行号插入新文本信息,原来这一行的内容变成下一行 | sed '[adress]i [content]' filename 或 sed '[adress]i\[content]' filename 或 sed '[adress] i\[content]' filename | sed '3 i\addcontent' text.txt 或 sed '3 i\addcontent' text.txt 或 sed '3i addcontent' text.txt :在三行后的加入一行(第四行)文本addcontent |
d | 删除定位行 | sed '[adress]d' filename | sed '3 d' text.txt 或 sed '3d' text.txt : 删除第三行 |
D | 删除模板块的第一行。 | ||
c\ | 用新文本替换定位文本 | sed '[adress]c [new line content]' filename 或 sed '[adress]c\[new line content]' filename 或 sed '[adress] c\[new line content]' filename | sed '3c\change lin3' text.txt 或 sed '3c change lin3' text.txt 或 sed '3 c\change lin3' text.txt : 将第三行的内容改为 change lin3 |
w filename | 写文本到一个文件,类似输出重定向 > | sed '[adress]w destfilename' sourcefilename | sed '3w text1.txt' text.txt : 将text.txt 的第三行数据复制到 text1.txt中。sed 'w text1.txt' text.txt : 将text.txt 的数据复制到 text1.txt中。如果text.txt为空,则会从第二行开始插入数据 |
r filename | 从另一个文件中读文本,类似输入重定向 < | sed ‘[address]r sourcefilename’ destfilename | sed '1r 1111.txt' text.txt : 将111.txt中的内容插入到 text.txt的第一行后面。 sed 'r 1111.txt' text.txt : 将111.txt中的内容插入到 text.txt的每一行后面。 |
s | 使用替换模式替换相应模式 | sed '[address]s/[word1]/[word2]' filename . 如果word2有&字符,表示追加在匹配的字符word1前追加&前的内容。word1后追加&后的内容。 | sed -i 's/before/after/' text.txt : 将text.txt每一行的第一个before单词替换为after。sed -i 's/before/after/g' text.txt : 将text.txt每一行的每一个before单词替换为after。sed 's/^/start /' text.txt :在每一行的开始添加 “start ” 单词。sed 's/$/ end/' text.txt 在每一行的结束添加 “end ” 单词 |
q | 第n个模式匹配完成后退出或立即退出 | sed'[command];[adress]q' filename | sed 's/before/after/;2q' text.txt : 将text.txt每一行的第一个before单词替换为after,只替换到第二行 |
l | 显示与八进制ACSII代码等价的控制符 | ||
{} | 在定位行执行的命令组,用分号隔开 | sed '命令1{命令2} ' filename | 匹配命令1的数据执行命令2。sed '/keyword/{d}' text.txt : 对匹配 keyword 关键词的行进行删除。 |
n | 从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理 | sed '[adress]n;[command]’filename | sed 'n;s/before/after/' text.txt : 从text.txt文件的第1行开始读数据,对第二行开始执行‘s/before/after/’命令。 然后从3 行开始读;第4行执行命令。sed 'n;d' text.txt : 删除2,4,6,8....行。sed '[adress]n;s/before/after/' text.txt : 表示对匹配[adress]的数据行不进行操作。 |
N | 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。 | set '[command1]N;[command]' :读入第一行是否匹配,匹配,则执行N命令-读入第二行,执行command命令;不匹配,直接执行command命令 | |
g | 将模式2粘贴到/pattern n/。获得内存缓冲区的内容,并替代当前模板块中的文本。 | sed '[address]/g' filename | sed -i 's/before/after/g' text.txt : 将text.txt每一行的每一个before单词替换为after |
G | 获得内存缓冲区的内容,并追加到当前模板块文本的后面。 | ||
y | 传送字符,替换单个字符。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a-->A,b-->B,c-->C。 | sed '[command]y/[origin-char]/[dest-char]/' filename | sed 'y/Tt/tT' text.txt : 将每一个T->t ,t->T |
! | 表示后面的命令对所有没有被选定的行发生作用。 | sed '[command]![command1]' : 对没有匹配command的行做command1命令 | sed -n '1,2!p' text.txt :打印出了1,2行的所有行 |
Sed 的正则表达式
元字符 | 功 能 | 示 例 | 示例的匹配对象 |
^ | 行首定位符 | /^love/ | 匹配所有以 love 开头的行 |
$ | 行尾定位符 | /love$/ | 匹配所有以 love 结尾的行 |
. | 匹配除换行外的单 个字符 | /l..e/ | 匹配包含字符 l、后跟两个任意 字符、再跟字母 e 的行 |
* | 匹配零个或多个前 导字符 | /*love/ | 匹配在零个或多个空格紧跟着 模式 love 的行 |
[] | 匹配指定字符组内 任一字符 | /[Ll]ove/ | 匹配包含 love 和 Love 的行 |
[^] | 匹配不在指定字符 组内任一字符 | /[^A-KM-Z]ove/ | 匹配包含 ove,但 ove 之前的那 个字符不在 A 至 K 或 M 至 Z 间 '/\(They\| second\| content\)/p'的行 |
\(..\) | 保存已匹配的字符 | '/\(word1\|word2\|word3\)/p' | 打印匹配word1、Word2、word3中任意一个的行 |
& | 保存查找串以便在 替换串中引用 | s/love/**&**/ | 符号&代表查找串。字符串 love 将替换前后各加了两个**的引 用,即 love 变成**love** |
\< | 词首定位符 | /\<love/ | 匹配包含以 love 开头的单词的 行 |
\> | 词尾定位符 | /love\>/ | 匹配包含以 love 结尾的单词的 行 |
x\{m\} | 连续 m 个 x | /o\{5\}/ | 分别匹配出现连续 5 个字母 o、 至少 5 个连续的 o、或 5~10 个 连续的 o 的行 |
x\{m,\} | 至少 m 个 x | /o\{5,\}/ | |
x\{m,n\} | 至少 m 个 x,但不 超过 n 个 x |