全部参考https://www.cnblogs.com/karl-python/p/9263911.html
1、sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作。sed时grep的继任,基本上就是玩正则表达式。
2、基本正则表达式
. | 匹配除换行符之外的任意字符嘛,在sed中不能匹配换行符。 |
* | 表示前面的字符有0或者多个。 |
[a-z] | 表示小写字母。 |
[A-Z] | 表示大写字母。 |
[0-9] | 表示数字。 |
[a-zA-Z] | 表示大写字母和小写字母。 |
[abc] | 表示匹配字符a或者b或者c。 |
[^0-9] | 表示非数字类型。 |
[-zc] | 表示匹配字符-或者z或者c。 |
^abc | 表示abc开头的字符串(只有当^在[]里面时,才是排除)。 |
^abc.* | 表示abc开头的字符串。 |
abc$ | 表示以abc结尾的字符串。 |
^$ | 表示空行。 |
\ | 把特殊字符转义为普通字符。 |
\{2\} | 表示前面字符的重复次数为2。 |
\{2,\} | 表示前面字符的重复字数大于等于2。 |
\{2,9\} | 表示前面字符的重复次数在2-9之间。 |
3、正则表达式的扩展
sed使用扩展正则需要加上选项-r。
? | 表示前置字符有0个或者1个。 |
+ | 表示前置字符有1个或者多个。 |
| | 表明两项之间的一个选择,abc|ABC表示匹配abc或者ABC。 |
() | 表示分组,用\1\2\3来表示分组内容。 |
{} | 和基本正则表达式一致,但是不用加转移字符。 |
4、sed语法
sed 选项 ‘cmd’ 文件名,下表所示为常见选项:
e | echo -e 'hello world\nnihao' | sed 's/hello/A/' | 结果: A world nihao |
echo -e 'hello world\nnihao' | sed -n 's/hello/A/' | -n不会输出默认的打印信息 | |
echo -e 'hello world' | sed 's/hello/A/;s/world/B/' | 结果:A B | |
i | sed -i 's/hello/A/' file.txt | [root@localhost]# cat file.txt A world (会直接修改到源文件,同perl的i选项) |
sed –i.bak 's/hello/A/' file.txt | 直接修改源文件,并将源文件的内容备份到file.txt.bak | |
f | echo "hello world" | sed -f sed.script s/hello/A/ s/world/B/ | -f可以指定一个脚本,将-e的多个选项放在脚本里,脚本里不需要使用‘’。 |
r | echo "hello world" | sed -r 's/(hello)|(world)/A/g' | A A -r支持拓展的正则表达式。 |
5、数字定址
sed -i ‘4s/hello/A/’ message | 原文替换第4行的字符 |
sed –i ‘2,4s/hello/A/’ message | 原文替换2-4行的字符 |
sed –i ‘4~3s/hello/A/’ message | 原文从第四行开始每隔3行将hello替换成A |
sed –i ‘$s/hello/A/’ message | 原文将最后一行的hello换成A |
sed -i ‘1!s/hello/A/’ message | 除了第一行,替换其他行 |
6、正则定址
sed -i ‘/nihao/d’ message | 将匹配到nihao的行删除 |
sed -i ‘/^$/d’ message | 删除空行 |
sed -i ‘/^TS/,/^TE/d’ message | 将匹配到的以TS开头的行和到以TE开头的行之间的行删除。 |
7、基本子命令(行号和命令之间可以有空格可以无空格)
a | sed ‘a A’ message | 将message的每一行下面都插入为A的行。 |
i | sed ‘i A’ message | 将message每一行上面都插入为A的行。 |
c | sed ‘c A’ message | 将每一行都替换为A。 |
d | sed ‘d’ messag | 将message的所有行删除。 |
= | sed ‘1,2=’ message | 打印行号的内容。 |
r | sed ‘2r a.txt’ message | 将指定文件的内容追加到指定行后面。 |
s | sed ‘s/hello/HELLO/’ message | 将hello替换为HELLO |
sed -r ‘s/[a-z]+ [0-9]+ [a-z]+/A/’ message | 将类似a 6 b的组合换成A,-r表示正则的扩展表达式。 | |
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/\3\2\1/’ message | 将a 6 b的组合换成b 6 a,\3\2\1代表前面小括号里面的内容。 | |
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/&/’ message | &表示正则表达式匹配到的整个结果集。 | |
sed -r ‘s/.*/111&222/’ message | 在message的行首和行尾加上111和222。 | |
sed ‘s/i/A/g’ message | 如果不加g只替换每行的第一个,加g表示替换所有。 | |
sed ‘s/i/A/2’ message | 替换每行的前两个 | |
sed ‘s/i/A/w b.txt’ message | 替换每行的第一个字符i haunch鞥A,并将修改后的内容保存到b.txt。 | |
sed -n ‘s/i/A/i’ message | 忽略被替换i的大小写。 |
8、sed工作模式
读取文件的一行,存入模式空间,然后进行所有子命令的处理,处理完后默认会将模式空间的内容输出打印到标准输出,也就是在屏幕上显示出来,接着清空模式空间的内存,继续读取下一行的内容到模式空间,继续处理,依次循环处理。保持空间会记住之前的行。其中置换命令如下所示:
h | 把模式空间内容覆盖到保持空间中 |
H | 把模式空间内容追加到保持空间中 |
g | 把保持空间内容覆盖到模式空间中 |
G | 把保持空间内容追加到模式空间中 |
x | 交换模式空间与保持空间的内容 |
用法:
# cat test.txt 11111 22222 33333 44444 | sed ‘{1h;2,3H;4G}’ test.txt 结果: 11111 22222 33333 44444 11111 22222 33333 |
sed ‘{1h;2x;3g;$G}’ test.txt 结果: 11111 11111 22222 44444 22222 | |
sed ‘{1!G;h;$!d}’ test.txt 结果: 44444 33333 22222 11111 |