https://www.gnu.org/software/sed/manual/sed.html
sed
/i #忽略大小写
/d #delete
/p #打印
sed -e #将多个表达式连接
-i #写入文件
-n #输出经过处理的行
sed '5,$d' tom.txt #删除5行至末尾
sed '1,4p' -n /etc/passwd #打印1到4行
#s 替换
sed 's/([0-9]*\s[0-9]*)/ton/' #匹配(123 123) 括号及括号里的数字,中间有一个空格
sed '87,93s/tom/ton/' #83到97行,tom替换成ton
sed '/0.88/,/0.99/s/tom/ton/' #从遇到0.88的行开始到有0.99的行结束 将tom换成ton
sed 's/^\s*//' #删除行首空格
# 添加行
sed -n -e '/\<tom\>/p' /etc/passwd #具体搜索单词并删除
sed '1a tom\nton' #在第一行后添加多行
sed '/Port 22/a\Port 1111' /etc/fiel #在port 22下面插入一行
sed 's/\#Port 22/Port 1111/' /etc/file #替换
-i 行前追加
-a 行后追加
-c 替换匹配的当前行
sed -i '/^ftp/i hello wrold' ./text.txt #匹配以text.txt文件中以ftp开头的行,匹配行前追加
-r 每次匹配都追加
-R 单行追加
sed -i '/^ftp/,19r ./line' ./text.txt #匹配以text.txt文件中以ftp开头的行,将line文件内容追加至匹配行至19行的每个行后
多行操作
通过使用下面的命令,sed可以对多行使用正则表达式,即在多行存储在模式空间中使用正则表达式。
这里sed维护两个数据缓冲区:活动模式空间和辅助保持空间。两者最初都是空的。
-l
打印当前模式空间的内容,方便debug
p 打印所有的
P 打印至\n
n 分行读
N 两行看成一行
d 分行删除重读
D 迭代式删除,删除到\n
[tom@paly ~]$sed -n 'N;N;P' disp.txt
line 1 #P打印line 1\nline 2\nline 3$中的第line 1
line 4 #P打印line 4\nline 5\nline 6$中的第line 4
[tom@paly ~]$sed -n 'N;N;p' disp.txt
line 1
line 2
line 3
line 4
line 5
line 6 #p打印到line 4\nline 5\nline 6$后,下一条NNP命令只走到了第一个N,即第一个N,读到文件尾,第2个N命令不成功,后面p命令亦不执行
[tom@paly ~]$sed -n 'N;$!N;p' disp.txt
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8 #第二个N加个$!不处理尾部,跳过第二个N,p会执行打印line 7\nline 8$
[tom@paly ~]$cat disp.txt
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
[tom@paly ~]$sed -n 'N;l;N;l' disp.txt
line 1\nline 2$
line 1\nline 2\nline 3$
line 4\nline 5$
line 4\nline 5\nline 6$
line 7\nline 8$
[tom@paly ~]$sed -n 'n;l;n;l' disp.txt
line 2$
line 3$
line 5$
line 6$
line 8$
[tom@paly ~]$sed -n '1!N;l;$!N;l' disp.txt #限制第一个N处理非第一行,第二个N处理非尾行
line 1$
line 1\nline 2$
line 3\nline 4$
line 3\nline 4\nline 5$
line 6\nline 7$
line 6\nline 7\nline 8$
[tom@paly ~]$sed -n 'N;l;N;l;D;l' disp.txt
line 1\nline 2$
line 1\nline 2\nline 3$ #迭代式删除,只删除到第一个\n
line 2\nline 3\nline 4$
line 2\nline 3\nline 4\nline 5$
line 3\nline 4\nline 5\nline 6$
line 3\nline 4\nline 5\nline 6\nline 7$
line 4\nline 5\nline 6\nline 7\nline 8$
[tom@paly ~]$sed -n 'N;l;N;l;d;l' disp.txt
line 1\nline 2$
line 1\nline 2\nline 3$
line 4\nline 5$ #整个删除再读新的
line 4\nline 5\nline 6$
line 7\nline 8$
[tom@paly ~]$sed '$!N;/\n.*tom/!P;D' disp.txt #删除匹配前一行
line 1
line 2
line 3
tom line 5
line 6
line 7
line 8
[tom@paly ~]$sed '$!N;l;/\n.*tom/!P;l;D' disp.txt
line 1\nline 2$
line 1
line 1\nline 2$
line 2\nline 3$
line 2
line 2\nline 3$
line 3\nline 4$
line 3
line 3\nline 4$
line 4\ntom line 5$
line 4\ntom line 5$
tom line 5\nline 6$
tom line 5
tom line 5\nline 6$
line 6\nline 7$
line 6
line 6\nline 7$
line 7\nline 8$
line 7
line 7\nline 8$
line 8$
line 8
line 8$
[tom@paly ~]$
脚本
sed -f rule.script < need_deal_file #同时可以将sed命令写成脚本
#脚本文件可以写成如下
#!/bin/sed -f
s/root/tom/
#然后直接运行脚本:change.sh /etc/passwd