Linux sed基本用法

1. 概述

sed是什么?一种流式编辑器。

1.1. 含义

非交互式,基于模式匹配过滤及修改文本。

1.2. 作用

可实现对文本的:输出、导出、导入、添加、删除、复制、剪切、替换、修改

1.3. 执行过程

以行为处理单位,默认把当前行当作处理对象,其有两个临时工作模式。

1.3.1. 模式空间

当sed对一个文件进行处理时,把处理的内容拷贝到自己的模式空间,然后再根据动作进行对行的处理,然后再输出,其内不存储处理过的数据。

1.3.2. 保持空间

默认只存储一个换行符号\n,用于临时存储数据,其内的数据不会被sed处理。

2. 语法

  • 命令 | sed [选项] ‘编辑指令/条件/动作’
  • sed [sed的选项] '对条件的选项/条件/动作' 文件名

3. 常用选项

-n //屏蔽源数据的默认输出
-i //直接修改文件内容
-e //扩展动作
-r //忽略正则表达式里的元字符,须在首位
-f //调用sed预先设定文件,一次性的对数据做处理

4. 常用动作

p //打印行 sed '2,4p' 1.txt 输出第2行和第4行
d //删除行 sed '2,4d' 1.txt 删除第2行和第4行
i //在行的上方添加内容 sed '4iab' 1.txt 在第四行上方插入一行ab
a //在行的下方添加内容 sed '4adc' 1.txt 在第四行下方插入一行dc
c //替换内容 sed '$c99' 1.txt 替换最后一行为99
s //替换一行中的部分
g //全局替换
= //输出加行号 sed '4=' 1.txt 输出时给第四行加行号
& //代表源数据,替换时使用
i //忽略大小写
w //导出文件内容
r //导入文件内容
H //模式空间道保持空间的追加
h //模式空间到保持空间的覆盖
G //保持空间到模式空间的追加
g //保持空间到模式空间的覆盖
n //让sed读取当前行的下一行到模式空间,跳过当前行
! //取反
() //保存源数据
\ //转译
+ //追加行数

5. 示例

5.1. 打印文件中行的用法及格式

sed -n 'p' 1.txt        //打印所有行
sed -n '1p' 1.txt        //打印第一行内容
sed -n '$p' 1.txt        //打印最后一行内容
sed -n '1p;3p' 1.txt        //打印第一行和第三行内容
sed -n '1,3p' 1.txt        //打印第一行到第三行内容
sed -n '/[0-9]/p' 1.txt        //打印所有包含数字的行
sed -n '/root/p' 1.txt        //打印所有包含root的行
sed -n '/^a/p' 1.txt        //打印所有以a开头的行

5.2. 删除文件中行的用法和格式

sed -i 'd' 1.txt        //删除全部行
sed -i '1d' 1.txt        //删除第一行
sed -i '$d' 1.txt        //删除最后一行
sed -i '2,5d' 1.txt        //删除第二行到第五行
sed -i '1d;3d;5d' 1.txt        //删除第一、三、五行
sed -i '/^root/d' 1.txt        //删除以root开头的
sed -i '/root/d' 1.txt        //删除存在root的行

5.3. 给文件中添加行的用法及格式

sed 'iaaa' 1.txt        //给所有行上方添加内容aaa
sed '1iaaa' 1.txt        //给第一行上方添加一行
sed 'abbb' 1.txt        //给所有行下方添加内容bbb
sed -i '/^abc/i123' 1.txt    //匹配abc开头的行,给其上加一行123

5.4. 替换文件中行的用法及格式

sed -i 'c123' 1.txt        //替换文件中所有行的内容都为123
sed -i '/^a/c123' 1.txt        //替换以a开头的所有行的内容为123
sed -i '$cppp' 1.txt        //替换文件中最后一行的内容为ppp
sed -i '1cppp' 1.txt        //替换文件中第一行的内容为ppp
sed -i '1,3cppp' 1.txt        //替换文件中第一行到第三行的内容为ppp
sed -i -e '1cA' -e '5cB' 1.txt    //替换文件中第一行和第五行的内容为A/B

5.5. 替换文件中一行里的部分内容

sed -i 's/root/AAA' 1.txt        //替换每行的第一个root为AAA
sed -i 's/root//g' 1.txt        //删除文件中的所有root
sed -i 's/:/#/g' 1.txt            //替换文件中的全部:为 #
sed -i 's/[0-9]\{1,\}/A/g' 1.txt    //替换文件中的所有数字为A
sed -ri 's/[0-9]{1,}/A/g' 1.txt        //替换文件中的所有数字为A
sed -ri '2s/[0-9]\{1,\}/A/g' 1.txt    //替换文件中第二行所有数字为A
sed -i '/root/s/^/#/g' 1.txt        //给全部存在root行的行首添加注释

5.6. 剪切文件内容

sed '1h;2H;1d;2d;$G' 1.txt        //把第一行和第二行剪切到末行

5.7. 导出文件内容

# 相当于vim里的另存为,导入时如目标文件不存在,则会自动创建
sed 'w  2.txt' 1.txt            //将1.txt中的所有内容导出到2.txt
sed '1,3w 2.txt' 1.txt            //将第一行到第四行导出到2.txt

5.8. 导入文件内容

# 把指定文件的内容,保存到当前文件里
sed 'r 1.txt' 2.txt            //将1.txt中的内容导入到2.txt每行的下面
sed '$r 1.txt' 2.txt            //将1.txt中的内容导入到2.txt的末行

5.9. sed流控制

sed 'n;d' 1.txt                //只删除偶数行
sed '4n;d' 1.txt            //只留第四行,其余全部删除
sed '4!d' 1.txt                //只留第四行,其余全部删除,取反
sed '/root/!d' 1.txt            //值留取存在root的行,其余全部删除
sed -i '/^$/{n;/^$/d}' 1.txt        //隔一个空行删一个空行

5.10. 调用sed预先设定文件,一次性的对数据做处理操作

vim /etc/comm.set
    s/[0-9]//g
    s/[^0-9a-Z]//g
    s/^.//g
sed -f /shell/comm.sed   a.txt

5.11. 追加行数

sed -i '2,+3d' 1.txt            //删除第二行和第二行后面的三行

本文链接:

http://blog.ps-ef.cn/Linux/114.html
1 + 6 =
快来做第一个评论的人吧~