一、sed (Stream Editor)
1、定位行:sed -n '12,~3p' pass #从第12行开始,直到下一个3的倍数行(12-15行)sed -n '12,+4p' pass #从第12行开始,连续4行(12-16行)sed -n '12~3p' pass #从第12行开始,间隔3行输出一次(12,15,18,21...)sed -n '10,$p' pass #从第10行至结尾sed -n '4!p' pass #除去第4行
2、正则:'/正则式/'sed -n '/root/p' /etc/passwdsed -n '/^root/p' /etc/passwdsed -n '/bash$/p' /etc/passwdsed -n '/ro.t/p' /etc/passwdsed -n '/ro*/p' /etc/passwdsed -n '/[ABC]/p' /etc/passwdsed -n '/[A-Z]/p' /etc/passwdsed -n '/[^ABC]/p' /etc/passwdsed -n '/^[^ABC]/p' /etc/passwdsed -n '/\<root/p' /etc/passwdsed -n '/root\>/p' /etc/passwd
3、扩展正则:sed -n '/root\|yerik/p' /etc/passwd #拓展正则需要转义sed -nr '/root|yerik/p' /etc/passwd #加-r参数支持拓展正则sed -nr '/ro(ot|ye)rik/p' /etc/passwd #匹配rootrik和royerik单词sed -nr '/ro?t/p' /etc/passwd #?匹配0-1次前导字符sed -nr '/ro+t/p' /etc/passwd #匹配1-n次前导字符sed -nr '/ro{2}t/p' /etc/passwd #匹配2次前导字符sed -nr '/ro{2,}t/p' /etc/passwd #匹配多于2次前导字符sed -nr '/ro{2,4}t/p' /etc/passwd #匹配2-4次前导字符sed -nr '/(root)*/p' /etc/passwd #匹配0-n次前导单词
4、sed编辑(对行的插入、删除、替换操作)sed '/root/a admin' /etc/passwd #在root行后追加一个admin行sed '/root/i admin' /etc/passwd #在root行前插入一个adminsed '/root/c admin' /etc/passwd #将root行替换为adminsed '/root/d' /etc/passwd #删除含有root的行
s替换sed -n 's/root/admin/p' /etc/passwdsed -n 's/root/admin/2p' /etc/passwd #在每行的第2个root作替换sed -n 's/root/admin/gp' /etc/passwdsed -n '1,10 s/root/admin/gp' /etc/passwdsed -n 's/root/AAA&BBB/2p' /etc/passwd #将root替换成AAArootBBB,&作反向引用,代替前面的匹配项sed -ne 's/root/AAA&BBB/' -ne 's/bash/AAA&BBB/p' /etc/passwd #-e将多个命令连接起来,将root或bash行作替换sed -n 's/root/AAA&BBB/;s/bash/AAA&BBB/p' /etc/passwd #与上命令功能相同sed -nr 's/(root)(.*)(bash)/\3\2\1/p' /etc/passwd #将root与bash位置替换,两标记替换或sed -n 's/\(root\)\(.*\)\(bash\)/\3\2\1/p' /etc/passwdbash:x:0:0:root:/root:/bin/root
y替换echo "sorry"|sed 'y/ory/ABC/' #一一对应替换(sABBC)
6、sed的模式空间和保持空间h:模式---->保持 H:模式--->>保持x:模式<--->保持g:保持---->模式G:保持--->>模式
例如:111222333444# sed '1h;2,3H;4G'
分析CMD 模式 保持111 111 \n1h 111 111----------->111222 222 1112,3H 222 111\n222 ----------->222333 333 111\n2222,3H 333 111\n222\n333----------->333444 444 111\n222\n3334G 444\n111\n222\n333----------->444\n111\n222\n333
1-1011-2222-3311-2234-END
7、sed特殊用法sed -n '/root/w a.txt' #将匹配行输出到文件sed '/root/r abc.txt' /etc/passwd #把abc.txt的文件内容读入到root匹配行后sed -n '/root/w a.txt'sed -n '/root/{=;p}' /etc/passwd #打印行号和匹配root的行sed -n '/root/{n;d}' /etc/passwd #将匹配root行的下一行删除sed -n '/root/{N;d}' /etc/passwd #将匹配root行和下一行都删除sed '22{h;d};23,33{H;d};44G' pass
8、sed 脚本编写方法<1>从文件读入命令sed -f sed.shsed.sh文件内容:s/root/yerik/ps/bash/csh/p
<2>直接运行脚本 ./sed.sh /etc/passwd#!/bib/sed -fs/root/yerik/ps/bash/csh/p
###################################二、Sed练习
1,删除文件每行的第一个字符。sed -n 's/^.//gp' /etc/passwdsed -nr 's/(.)(.*)/\2/p' /etc/passwd2,删除文件每行的第二个字符。sed -nr 's/(.)(.)(.*)/\1\3/p' /etc/passwd
3,删除文件每行的最后一个字符。sed -nr 's/.$//p' /etc/passwdsed -nr 's/(.*)(.)/\1/p' /etc/passwd
4,删除文件每行的倒数第二个字符。sed -nr 's/(.*)(.)(.)/\1\3/p' /etc/passwd
5,删除文件每行的第二个单词。sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\2\3\5/p' /etc/passwd
6,删除文件每行的倒数第二个单词。sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4\5\6/p' /etc/samba/smb.conf
7,删除文件每行的最后一个单词。sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4/p' /etc/samba/smb.conf
8,交换每行的第一个字符和第二个字符。sed -nr 's/(.)(.)(.*)/\2\1\3/p' /etc/passwd
9,交换每行的第一个单词和第二个单词。sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/samba/smb.conf
10,交换每行的第一个单词和最后一个单词。sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/passwd
11,删除一个文件中所有的数字。sed 's/[0-9]*//g' /etc/passwd
12,删除每行开头的所有空格。sed -n 's/^\ *//p' /etc/samba/smb.conf sed -nr 's/( *)(.*)/\2/p' testp
13,用制表符替换文件中出现的所有空格。sed -n 's/\ /\t/gp' pass
14,把所有大写字母用括号()括起来。sed -nr 's/([A-Z])/(&)/gp' testp sed -n 's/[A-Z]/(&)/gp' testp
15,打印每行3次。sed 'p;p' pass
16,隔行删除。sed -n '1~2p' pass
17,把文件从第22行到第33行复制到第44行后面。sed '1,21h;22h;23,33H;44G' pass
18,把文件从第22行到第33行移动到第44行后面。sed '22{h;d};23,33{H;d};44G' pass
19,只显示每行的第一个单词。sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)/\2/p' /etc/passwd
20,打印每行的第一个单词和第三个单词。sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\2--\4/p' /etc/passwd
21,将格式为 mm/yy/dd 的日期格式换成 mm;yy;dddate +%m/%Y/%d |sed -n 's#/#;#gp'
22, 逆向输出cat a.txtABCDEFXYZ输出样式变成XYZDEFABC
转载于:https://www.cnblogs.com/vania/p/4701377.html