sed:Linux三剑客之一(awk-sed-grep)
1、sed功能:操作、过滤和转换文本内容的强大工具
常用功能:增删改查、过滤、改行
(1)查看sed版本: sed --version
(2)语法格式:sed [options] [sed-commands] [input-file]
(3)查看sed用法:man sed
(4)sed模式空间:sed软件内部的一个临时缓存,用于存放读取到的内容
注意事项:
a、sed和后面的选项间都有空格
b、sed-commands既可以是单个sed命令,也可以是多个sed命令的组合
c、执行流程:sed软件是从文件或管道中读取一行,操作一行,一行一行的处理,直到文本结束
2、sed操作:
-i :修改文件内容,若不加文件内容不会改变
增删改查:
增:
(1)增加新行
a 追加文本到指定的行后
i 插入文本到指定的行前
单行增加
如:sed '2a awswdacwxw' file2 在第二行后增加内容为“awswdscwxw”的新行
sed '2i abcdefg' file2 在第二行前增加内容为“abcdefg”的新行
多行增加
如:sed '2a abc\ndef' file2 若增加多行须在各行间增加 \n
注:此时不会修改文件
(2)通过地址范围操作:(增删都适用)
用法: n1,n2{sed-commands} 地址用逗号分隔,n1,n2可以是数字、正则表达式或者二者组合
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对第10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7,9....行进行操作 ~数字:指定步长
10,${sed-commands} 对第10行到最后一行进行操作($代表最后一行)
/old/{sed-commands} 对匹配old的行操作
/begin/,/end/{sed-commands} 对第一次匹配begin的行开始到匹配到第一次匹配end的行之间的行进行操作
/begin/,10{sed-commands} 从第一次匹配到begin的行开始到第10行进行操作
删:
(1)d 删除指定的行
(2)删除全部行 : sed "d" filename
注:增加时的特殊含义在此处也可以用
如:sed "1~2d" filename 删除奇数行
sed "1,+2d" filename 删除第1-3行
企业案列:打印文件内容但不包括old的行
# sed "/old/d" filename
改:
(1) c 用新行取代旧行
(2)文本替换
s单独使用,会把匹配行的第一项匹配的更换掉,代表行
g全局参数,每行或全文所有匹配的都替换,全局替换参数
Ng参数,查找此行记录匹配的第N项
使用方式:
sed -i 's/one/two/g' filename
sed -i 's#one#two#g' filename
企业案列1:精确修改对应行的文件内容
# sed '3s#one#two#' filename 将第三行的one改为two
(3)分组替换 \(pattern\)和\1的使用说明
\(pattern\) :用于匹配字串 \1 \2 ...用来引用第几个匹配的字串,最多支持九个 (\9)
&:存储前面匹配的字串
-r代表使用扩展则很扩展正则表达式(此时特殊符号不许转义)
案列:
(1)# echo 'this is digit 7 in a number'|sed 's/digit \([0-9]\)/\1/'
输出 this is 7 in a number
(2)匹配单词 : \([a-zA-Z]\+\) 注:+号还需转义
(4)特殊符号 & 代表被替换的内容
如: sed '1,3s#one#----&----#g' filename ----> 注:此处 &代表one
twoone替换后结果-----> two----one----
企业案列:批量重命名文件
^.* 以任意字符开头的行
ls *jpg|sed -r 'S#(^.*)_fined.*#mv & \1.jpg#g'|bash
查:
(1)p 输出指定内容,但默认会输出2次匹配的结果,所以需结合 -n 选项去除重复输出
-n 输出指定行(不加会输出全部文件内容,匹配行输出两次)
3、sed安全修改
# sed -i.bak 'options' filename //sed修改前先为原先的文件准备备份文件filename.bak
4、“=”用于输出行号
用法: /pattern/=
如:sed -i '/pattern/='
5、特殊地
test.txt wangqixaun
sed -i '/^wang/s#qixuan#QIXUAN#g' test.txt
注: 此时 /^wang/s 含义:在以 wang 开头的行进行操作