sed 的工作流程主要包括 读取,执行 ,显示, 三个过程
在所有的文件内容都被处理完之前,上述过程将重复执行,直到所有内容都被处理完
默认情况下所有的sed命令都是在模式空间内执行,因此输入的文件并不会发生任何变化,除非用重定向存储输出
sed 默认只支持基础正则
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ....
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2
sed -e 'n{ 操作1 操作2 ..... }' 文件1 文件2
选项 | 释义 |
---|---|
-e 或者 --expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可以省略一般在执行多个操作命令使用 |
f 或者--file= | 表示用指定的脚本文件来处理输入的文本文件 |
h 或者 --help | 显示帮助 |
-n , --quit 或者silent | 禁止sed 编辑器输出。可以与p命令一起使用完成输出 |
-r | 让sed 支持扩展正则表达式 |
-s | 将输入的文件视为各个独立的文件,而不是一个长的连续输入 |
-i | 直接修改目标文本文件 |
sed 的操作,如果不加 -i 选项,是不会改变文件内容的
操作 | 释义 |
---|---|
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行的下面增加一行指定内容 |
i | 插入,在选定行的上面插入一行指定内容 |
c | 替换,将选定行整行替换为指定内容 |
y | 字符转换,转换前后的字符长度必须相同(不能对正则表达式使用) |
p | 答应,如果同时指定行,表示打印行。如果不指定行,则表示打印所有内容 |
= | 打印行号 |
l(小写L) | 打印数据流中的文本和不可打印的ASCII 字符(如结束符$,制表符 \t) |
n | 读取下一行内容 |
q | 退出sed程序 |
! | 取反 |
h | 把模式空间里的内容复制到暂存缓冲区 |
H | 把模式空间里的内容追加到暂存缓冲区 |
g | 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 |
G | 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 |
w 文件 | 将所选的行写入文件 |
以数字形式表示行区间
sed -n '3p' testfile #打印第三行
用文本模式来过滤出行
sed -n '/a/p' testfile #打印包含a的行
如; sed -n '1~2p' testfile , “1~2p” 表示 从第一行开始打印,步长是2,也就是打印奇数行
sed 可以将要匹配的内容写在斜线"/" 之间 如: sed -n '/a/p' testfile2 表示匹配包含 a 的行并打印
sed 默认支持基础正则。如果使用扩展正则,需要加上选项 -r
sed -n '/a/, /b/p' testfile2 #遇到匹配a 的行,打开 p ,打印操作。遇到匹配b 的行,关闭打印操作 #如果执行 打开 p 打印操作后,没有匹配到 含有 b 的行,则会一直打印,知道 匹配到含有b的行
sed 先读取了第 1 行,然后执行 了 p 打印操作,打印了第 1 行的内容
之后,再执行 n 操作,读取下一行,也就是读取第 2 行。但是因为后续没有 p 打印操作,所以,第 2 行灭有打印
然后,sed 读取第 3 行内容,执行 p 打印操作,打印 第 3 行内容
之后,再执行n 操作, 读取下一行,也就是读取第 4 行。但是,依旧因为没有p 操作,无法打印出来
sed 先读取第 1 行内容, 因为内有 p 操作,所以,第一行没有打印。
再执行n 命令,读取下一行 ,也就是读取第2 行,之后再执行 p 命令,将第 2 行打印出来
sed 读取 从第 5 行 到 最后一行。中间以 np 的 形式操作。
读取 第 5 行 ,因为没有 p 操作,所以不打印。然后执行 n操作 ,读取下一行的,也就是读取 第6 行。然后再执行 p 打印操作,打印第 6 行
然后 再读取第 7 行,之后,不打印。执行 n 操作,读取下一行,也就是读取第 8 行。然后再执行 p打印操作,打印第8 行。
一直循环,一直到最后一行
也就是说,sed '5q' testfile1 命令,sed 只读取到第 5行 就终止了工作
行范围 s/旧字符/新字符/替换标记 #字符替换
行范围c 新字符 #整行替换
行范围 y/旧字符串/新字符串 #旧字符串的长度要和新字符串长度一样
替换标记
标记 | 释义 |
---|---|
数字 | 表明新字符串将替换地基础匹配的地方 |
g | 表明新字符串将会替换所有匹配的地方 |
p | 打印与替换命令匹配的行,与 -n 选项一起使用 |
w 文件 | 将替换的结果写到文件中 |
先编写支持sed 命令的脚本
vim 1.sed /^root/ s/^/#/p # 将所有root开头的行,加上#号注释 /nologin$/ s/nologin/false/p #将所有nologin结尾的行,将nologin替换为false :wq
执行sed 命令
选项 -f 后面加上支持sed的脚本文件
[root@host103 test]# sed -n -f 1.sed /etc/passwd
sed 替换时,字符串的分隔符 不是必须为 "/" ,也可以为 “@”,“#” ,“1”,“2”,"a" ,"b" ... 只要保持一致即可
h/H 复制到剪切板,g/G 黏贴到指定行
s/()()/\2\1
使用 ()括号,将模式空间内容整体分段复制到保留空间
再按照一定顺序输出到模式空间