sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法解析
sed [选项] 编辑命令 文件
选项:
- -n:只显示匹配处理的行
- -e:执行多个编辑命令时
- -i:在原文件中进行修改,不输出到屏幕
- -r:支持扩展正则表达式
- -f:从脚本文件中读取内容并执行
编辑命令:
- p:打印匹配行(print)
- d:删除指定行 (delete)
- a:在匹配行后面追加 (append)
- i:在匹配行前面插入 (insert)
- c:整行替换
- r:将文件的内容读入 (read)
- w:将文本写入文件 (write)
- s:字符串替换(匹配正则表达式)(substitution)
- =:输出行号
使用示例
先创建文件test.txt,并写入如下内容:
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki
p命令的使用
通常与-n选项结合使用
输出行内容:
sed -n '1p' test.txt // 输出第一行内容
sed -n '1,5p' test.txt // 输出1~5行内容
sed -n '$p' test.txt // 输出最后一行内容
sed -n '1p;2p;5p' test.txt // 输出第1、2、5行内容
模式匹配输出行:
sed -n '/模式/p' 文件
sed -n '/is/p' test.txt // 打印存在 is 内容的行
d命令的使用
删除指定行:
sed '3d' test.txt // 删除第三行内容
a命令的使用
与-i选项结合使用,在原内容的基础上进行修改
sed -i '1a linux-next' test.txt // 在第一行后添加了‘linux-next’内容
sed -i '/is/a is-next' test.txt // 在含有 is 内容的行后添加‘is-next’内容
i命令的使用
与a命令使用类似,只不过是在指定行前插入。
sed -i '1i linux-next' test.txt // 在第一行前插入
sed -i '/is/i is-next' test.txt // 在含有 is 内容的行前添加‘is-next’内容
c命令的使用
对整行进行修改
sed '1c hello linux' test.txt // 对第一行内容进行修改 内容改为‘hello linux’
// 因为没有带任何选项,所以默认打印操作后的所有行内容,不会在原内容上修改
sed '/is/c hello linux' test.txt // 将含有 is 内容的行修改为hello linux
r命令的使用
将指定文件读入到文件中,操作执行在指定行的后面。
新建一个临时文件tmp:
I am new content
将tmp文件的内容读入到test.txt文件中
sed '1r tmp' test.txt // 对test.txt文件的第一行读入tmp文件
模式匹配读入
sed '/is/r tmp' test.txt // 将tmp文件内容读入到test.txt文件中含义is的行之后
s命令的使用--文本替换
sed -i '[address]s/pattern/replacement/flags' filename
// -i 加上选项时在原文上修改,不加则不会修改原文内容
// pattern 查找内容
// replacement替换内容
address用法如下:
address 数字,表示第几行。如3指第三行
address,address1 数字,表示从第几行到第几行。如3,5 从第三行到第五行
$ 表示最后一行。如2,$ 从第二行到最后一行
flags 标记功能
n 1~512 之间的数字,表示指定要替换的字符串在一行中出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g 全局替换。对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file 将缓冲区中的内容写到指定的 file 文件中;
& 用正则表达式匹配的内容进行替换;
\n 匹配第 n 个子串,该子串之前在 pattern 中用 指定。
\ 转义(转义替换部分包含:&、\ 等)。
用法案例:
lixd@VM-16-13-ubuntu:~/practice$ cat test.txt
LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Taobao
Runoob
Tesetfile
Wiki
下面的操作不加 -i 选项,不会在原文内容上修改:
// 将全局的LINUX替换为MySQL
sed 's/LINUX/MySQL/g' test.txt
// 将每行第二次出现的a字符替换为#
sed 's/a/#/2g' test.txt
// 将第1到第三行头部添加#
sed '1,3 s/^/#/g' test.txt
// 将第一到第三行末尾添加?
sed '1,3 s/$/?/g' test.txt