Linux文本三剑客---sed
sed 是什么?
sed 是一种支持正则表达式的非交互式流编辑器,stream editor — 这个编辑器的流代表的是文本流。sed 可以用来修改和替换文本的内容,理解为一个文本的加工工厂,工作方式是从第一行开始一行一行对需要处理的数据进行加工。
sed 常用的方法
-i | 可以对源文件的内容进行修改 – 这个用法比较重要 |
---|---|
-n | 只显示匹配处理的行,没有-n就会输出所有的内容 |
-r | 支持扩展正则表达式 |
-f | 从脚本文件中读取命令并执行 |
-e | 执行多个编辑命令( 可以用 ; 代替 ) |
sed 常用编辑命令和方法的组合总结
p: print 打印匹配行
sed -n '3,7p' 文件名 # 输出文件 3 到 7 行的内容
sed -n '1p;3p;5p' 文件名 # 输出文件第 1、3、5 行的内容
sed -n '1,$p' 文件名 # 输出文件 1 到 最后一行
sed -n '2,+2p' 文件名 # 从第二行开始,往下再来两行,也就是第二行到第四行
sed -n '5,100!p' 文件名 # 不输出 5 到 100 行,这里 !p 就是取反的意思
sed -n '1~2p' 文件名 # 步长命令,从 1 开始,每次加 2 输出,这里也就是输出奇数行的意思
sed -n '/bash/p' 文件名 # 能输出含有 bash 的行
这个功能就是sed的查找功能了 用 egrep bash 或者 awk '/bash/' 也能实现同样功能
要记住,一般 p 是会同 n 一起使用的,n 和 p 是黄金搭档
d: delete 删除指定行
sed '3,5d' 文件名 # 删除 3-5 行
sed '/2/d' 文件名 # 删除包含数字 2 的行
sed 'etc3/!d' 文件名 # 出了etc3 的行 其他的全部删除 同样 !d 是取反的意思
这里要特别注意,-n 后面不能使用编辑命令 d , 因为东西被删除了之后是显示不出来的!
a: append 在匹配行后面追加S
sed '1a ameame' 文件名 # 在第一行后面追加 ameame 的内容
然后需要注意的是 这个追加是另起一行进行追加
s: substitute 字符串替换 核心功能
sed 's/文本1/文本2/' filename # 只会将每行第一个文本1替换成文本2 只会替换每行的第一个!!!
sed 's/文本1/文本2/2' # filename 把每一行的第二个文本1替换成文本2
sed 's/文本1/文本2/g' filename # 会将每行所有的文本1替换成文本2
sed 's/文本1/文本2/2p' filename # 会将每一行从第二个开始 后面的所有文本1改换成文本2 简单说为就是不替换第一个
sed '/^#/ s/文本1/文本2/' filename # 将文件中以 # 开头的行里面的第一个文本1改换成文本2
\n 换行
\t tab
\s 空白 这个sed不支持 只能用上面两个
sed -n '2,10 s/^/#/' filename # 在文件的第二行到第十行在开头加上# 把它注释掉
sed -i '/文本1/ s/文本2/文本三/' filename # 把文件有文本1的行里面把文本二的内容替换成文本三
w: write 将文本写入 这个功能不厉害 少用
sed '/^#/!w xxx.txt' filename # 将目标文件的非#号开头的内容写进xxx.txt文件中```
r: read 将文件的内容读入 有这么回事 不经常用
c: 整行替换
sed -i '1c xxxxxx' filename 将文件第一行的内容改成xxxxxx
sed -i '/^#Port/c Port 2233' sshd_config
# 将#Port开头的那一行的内容改成 Port 2233 在sshd_config中进行改动
i: insert 在匹配行前面插入
sed '1i qqqqqq' filename
# 在第一行前面追加qqqqqq 这个追加也是另起一行 在目标行的前面追加
补充一下 sed 标签的用法
echo aa bb cc | sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1 /'
# 输出结果为: cc bb aa 就是后面对输出内容进行标号排序
后续还有Linux文本三剑客中的其他两个 – grep 和 awk
Linux 文本三剑客 - awk 已更新!