sed 是Linux 系统一款非常强大的非交互式的文本编辑器,可以对文本进行增删改查操作,正则匹配文本内容。适合大文件编辑
sed 语法
sed +选项 ‘指令’ 文件
sed +选项 -f 包含sed指令的文件 文件
常用参数
-i:直接修改文件内容,而不是输出到终端。
-n:安静模式,屏蔽默认输出(全部文本),只有经过sed特殊处理的那一行才会被列出来。
-e :指定sed动作,可以由多个-e指定多个动作。
-r:启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
-f :直接将sed的动作写在一个文件内,-f filename则可以运行filename 内的sed动作;
--help:显示帮助。
--version:显示版本。
-{}:可组合多个命令,以分号分隔
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何内容;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :替换,通常这个s的动作可以搭配正规表示法!例如 1,20s/old/new/g。
准备数据
mkdir sed
cd sed
vi 01.txt
1
2
3
hi
你好
输出所有行
#输出所有行,等同于cat 01.txt
sed '1p' 01.txt
sed -n 'p' 01.txt
输出指定行
#输出第1行
sed -n '1p' 01.txt
#输出第4行
sed -n '4p' 01.txt
#输出最后一行
sed -n '$p' 01.txt
#输出第5行到最后一行
sed -n '5,$p' 01.txt
#输出第5行及其后的2行内容,共3行
sed -n '5,+2p' 01.txt
#输出包含A的行
sed -n '/A/p' 01.txt
#输出包含A的行忽略大小写 I
sed -n '/A/Ip' 01.txt
#输出以a开头的行或者以r(R)开头的行
sed -n '/^a/p;/^r/Ip' 01.txt
#输出以dsf结尾的行
sed -n '/dsf$/p' 01.txt
#输出偶数行
sed -n 'n;p' a.txt
#输出奇数行
sed -n 'p;n' 01.txt
输出文档行数
sed -n '$=' 01.txt
添加 实例都是不修改源文件 如果需要修改源文件 加上-i
#从第2行开始到第4行每一行都增加一条
sed '2,4a felicia 你好 "adf"' 01.txt
sed -e 2,4a\你好! 01.txt
#不写2,4 每一行都增加一条
sed 'a felicia 你好 "adf"' 01.txt
sed -e a\你好! 01.txt
#第2行后加一行
sed '2a felicia 你好 "adf"' 01.txt
sed -e 2a\felicia,你好 01.txt
#第2行前加一行
sed '2i felicia \n你好' 01.txt
sed -e 2i\felicia,你好 01.txt
#在第1行插入02.txt 文件内容
sed '1r 02.txt' 01.txt
删除
实例都是不修改源文件 如果需要修改源文件 加上-i
#删除所有行
sed 'd' 01.txt
#删除第1行
sed '1d' 01.txt
#删除最后1行
sed '$d' 01.txt
#删除所有空行
sed '/^$/d' 01.txt
#删除第2行到第5行
sed '2,5d' 01.txt
#删除包含你好或者abc 的行
sed '/你好\|ABC/d' 01.txt
#删除包含你好或者abc 的行
sed '/你好/d;/abc/d' 01.txt
#删除包含你好并且abc的行
sed '/你好/{/abc/d}' 01.txt
#删除不以abc开头的行 !表示取反
sed '/^abc/!d' 01.txt
取代
实例都是不修改源文件 如果需要修改源文件 加上-i
#取代第三行的内容
sed '3c 你好呀 \n好久不见' 01.txt
sed -e 3c\你好 01.txt
#取代第1行至第3行的内容
sed '1,3c aaaaa' 01.txt
#取代第1行及后面3行的内容 共4行
sed '1,+3c aaaaa' 01.txt
#每一行第1个你好 替换 aaa
sed 's/你好/aaa/' 01.txt
#第1行到第10行 第1个你好 替换 aaaa
sed '1,10s/你好/aaaa/' 01.txt
#第1行到第10行 第2个你好 替换 aaaa
sed '1,10s/你好/aaaa/2' 01.txt
#第1行到第10行 所有 你好 替换 aaaa
sed '1,10s/你好/aaaa/g' 01.txt
#将所有的你好 替换 你好s & 表示查找串
sed 's/你好/&s/g' 01.txt
#将第1行至第3行 添加#
sed '1,3s/^/#/' 01.txt
#将所有 你好 或者ABC 或者 abc 替换成空字符 \|表示或者
sed 's/你好\|ABC\|abc//g' 01.txt
删除文件中每行的第二个、最后一个字符
#.匹配任意字符
sed 's/.//2;s/.$//' 01.txt
将文件中每行分割为 1:1个字符:2:1个字符 3:2个字符 4:剩下字符 然后按照 4-3-2-1 重新排序
#.匹配任意字符
sed -r 's/^(.)(.)(..)(.*)/\4\3\2\1/' 01.txt
将文件中每行分割为 1:1个字符:2:1个字符 3:2个字符 4:剩下字符 然后按照 4-3-2-1 重新排序
sed -r 's/(.)(.*)(.)/\3\2\1/' 01.txt
每个大写字母用()括起来
sed 's/[A-Z]/(&)/g' 01.txt
删除所有数字、行首空格
sed -r 's/[0-9]//g;s/^( )+//' 01.txt
查找roo开头的行
sed -n '/^root/p' /etc/passwd
#不区分大小写
sed -n '/root/I p' /etc/passwd
#区分大小写
sed -n '/root/p' /etc/passwd
#查找包含/sbin/nologin 的行
sed -n '\%/sbin/nologin% p' /etc/passwd
复制剪切
复制:
H:模式空间—[追加]—>保持空间
h:模式空间—[覆盖]—>保持空间
粘贴:
G:保持空间—[追加]—>模式空间
g:保持空间—[覆盖]—>模式空间
#把第1-3行复制到文件末尾
#可避免出现空行
sed '1h;2,3H;$G' test.txt
#此处有空行时因为第一次是在保持空间里追加,而保持空间默认有一个空行
sed '1,3H;$G' test.txt
#把第1-2行剪切到文件末尾
sed '1h;2H;1,2d;$G' test.txt