sed命令的执行过程:按行读取文件到模式空间(临时缓存)并进行匹配,执行sed内的命令,从模式空间打印结果到屏幕。
命令用法:sed [选项] [sed内置命令] [输入文件]
增删改查
a) 增
a 追加文本到指定行后
i 插入文本到指定行前
单行增加
sed ‘2a xiaoming’name.txt #在name文件的第二行后追加xiaoming
sed ‘2i xiaoming’name.txt #在name文件的第二行前插入xiaoming
多行增加
1.使用\n进行多行增加
sed '2a xiaoming\nxiaohua\nxiaohong' name.txt
2.使用\加回车进行多行增加
sed ‘2a xiaoming\回车
>xiaohua\回车
>xiaohong’name.txt
指定执行的地址范围进行修改
用法: n1[,n2] {sed内置命令}
地址用逗号分隔,n1,n2可以用数字、正则表达式、或二者的组合表示
重要用法:
10{sed内置命令} #对第10行操作
10,20{ sed内置命令} #对第10到20行(包括10,20行)操作
10,+20{ sed内置命令} #对第10到30行进行操作
1~2{ sed内置命令} #对第1,3,5,7….行进行操作
10,${ sed内置命令} #对第10到最后行进行操作
/xiaoli/{ sed内置命令} #对匹配xiaoli行进行操作
/xiaoli/,/xiaohua/{ sed内置命令} #对匹配xiaoli到xiaohua行进行操作
/xiaoli/,${ sed内置命令} #对匹配xiaoli行到最后行进行操作
/xiaoli/,10{ sed内置命令} #对匹配xiaoli行到第10行进行操作,如果前10行没有xiaoli则会显示10行后匹配到xiaoli的行
1,/xiaoli/{ sed内置命令} #匹配第1行到匹配xiaoli行进行操作
/xiaoli/,+2{ sed内置命令} #对匹配xiaoli行及其后2行进行操作
b) 删
d 删除指定行
sed 'd' name.txt #删除文件所有行
c) 改
按行替换
c 用新行取代旧行
sed '2c xiaoli' name.txt #把第2行替换为xiaoli
文本替换
s:单独使用时将每一行中第一处匹配的字符串进行替换,是sed内置命令
g:每一行进行全部替换,是sed内置命令s的替换标志之一,非sed内置命令
-i:修改文件内容,sed命令的选项(不加只会在临时缓存中修改)
用法:(A被替换为B)
sed -i 's#A#B#g' name.txt (并非必须使用定界符#也可使用其他符号#显眼而已)
A处能用正则而B不能使用正则
变量替换
sed "s#$x#$y#g" #先读取变量然后进行修改,注意为双引号
分组替换
\( \) 和 \1的使用说明:
\(\)可以记住正则表达式的一部分,\1则视为第一个记住的匹配内容,\2为第二个
最多可以记9个
例子:echo 'I am xiaoli student' |sed 's#^.*am \(.*\) stu.*$#\1#g'
输出为 xiaoli
注意:其中匹配是的空格等信息,可以在sed中加入-r选项使用扩展正则,\(\)可替换为()
echo 'I am xiaoli student' |sed -r 's#^.*am (.*) stu.*$#\1#g'
特殊符号&代表被替换的内容
sed '1,3s#xiaoli#--&--#g' name.txt #将1到3行的xiaoli换成--xiaoli--
sed 's#xiao(.*)$#&#g' #&就将匹配xiaoli整一个部分
可用来批量重命名名字有规律的文件:
touch xiaoli{1..5}.txt
ls *.txt |sed -r 's#xiaoli(.*)$#mv & \1#g'
输出为:
mv xiaoli1.txt 1.txt
mv xiaoli2.txt 2.txt
mv xiaoli3.txt 3.txt
mv xiaoli4.txt 4.txt
mv xiaoli5.txt 5.txt #使用bash即可重命名 ls *.txt |sed -r 's#xiaoli(.*)$#mv & \1#g'|bash
d)查
按行查询
p 输出指定内容,但默认会输出两次匹配的结果所以用n
n 取消默认输出
sed -n '2p' name.txt #显示第二行
按字符串查询
sed -n '/li/p' name.txt #匹配有字符串li的行
混合查询
结合上面的按地址等方法来匹配行