sed命令

全部参考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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值