Linux三剑客学习笔记——sed
Linux中文本处理的3把瑞士军刀sed,awk和grep,在我看来grep偏向于偏向于对匹配到的内容进行提取统计,awk偏向于对匹配到的内容进行格式化,而sed偏向于对匹配到的内容进行编辑。
本文档主要介绍sed命令的常用简单用法,高级用法需要深入理解sed的实现原理,本文不深入,即学即用。学习sed命令要求开发者首先要了解正则表达式,sed在实际应用中常常结合正则表达式使用。sed常用于shell脚本的编写,实现文本自动化变更。
一、sed常用格式
常用sed参数 | |
---|---|
-i | 修改文件内容,匹配后修改目标文件内容 |
-n | 取消默认输出,匹配后操作不会打印到终端 |
常用sed功能选项 | |
---|---|
a | 追加内容到指定行后 |
i | 插入内容到指定行前 |
s | 对每一行第一次匹配到的内容进行替换,配合标志g可以将一行中所有匹配到的内容进行替换 |
常用sed高级命令 | |
---|---|
g | g代表全局替换,如果后面不带g,只替换每行第一个 |
d | 删除匹配内容所在行 |
p | 输出指定内容,默认会输出2次匹配到的内容(默认输出打印一次,p命令打印一次) |
二、匹配
&代表的实际是前面进行匹配的“匹配内容”,sed执行如果没加参数,则默认打印“变更后内容”
1、头匹配^
匹配所有以ABC开头的行,然后不做操作
sed 's/^ABC/&/' $file_path
2、尾匹配$
匹配所有以ABC结尾的行,然后不做操作
sed 's/ABC$/&/' $file_path
3、任意匹配
匹配所有含有ABC的行,然后不做操作
sed 's/ABC/&/' $file_path
4、匹配指定个数字符
因为在sed 命令中 / ( ) 是特殊符号,如果需要在sed的’//'内使用正则表达式,为了避免误判,要在这些符号前加上\
\(..\) 表示匹配任意2个字符
\(....\) 表示匹配任意4个字符
匹配所有以ABC开头的ABC后面的4个字符,然后不做操作
sed 's/^ABC\(....\)/&/' $file_path
5、匹配任意个数字符
.* 表示匹配任意个字符
\(.*\)" 表示第一个引号前的内容
"\(.*\)" 表示两引号之间的内容
"\(.*\) 表示引号后的内容
三、匹配后的操作
1、获取匹配项信息
1.1、匹配项所在行数
“=”输出匹配项所在行行号,如输出“ABC”所在行行号
sed -n '/ABC/=' $file_path
1.2、获取匹配成功个数
对匹配结果数目进行统计用grep命令,“-c”参数,如统计在文件中“ABC”出现的个数
grep -c 'ABC' $file_path
2、匹配项操作
2.1、匹配项非全局替换(只替代每行第一个)
sed -i 's/指定的字符/替换字符/' $file_path
2.2、匹配项全局替换
sed -i 's/指定的字符/替换字符/g' $file_path
把文本文件中所有ABC都替换成CDF
sed -i 's/ABC/CDF/g' $file_path
2.3、匹配项前面加
sed -i 's/指定的字符/需要添加的字符&/' $file_path
在文件中,所有ABC前面都加上CDF
sed -i 's/ABC/CDF&/' $file_path
2.4、匹配项后面加
sed -i 's/指定的字符/&需要添加的字符/' $file_path
2.5、获取匹配项前后的字符串
sed 's/\(.*\):\(.*\)/\1/g' $file_path
“\1”、“\2”:分别表示第一、二对括号里面的内容,
括号里的表达式匹配的内容,可以用\1,\2等进行引用,第n个括号对内的内容,就用\n引用。
文本:ABCDE
sed 's/\(.*\)C\(.*\)/\1/g' $file_path #输出AB
sed 's/\(.*\)C\(.*\)/\2/g' $file_path #输出DE
3、匹配项所在行操作
3.1、匹配项前一行加
在匹配项的上一行新增一行,内容为“新行内容”
sed -i 's/指定的字符/i\新行内容/' $file_path
3.2、匹配项后一行加
在匹配项的下一行新增一行,内容为“新行内容”
sed -i 's/指定的字符/a\新行内容/' $file_path
3.3、匹配项所在行删除
sed -i 's/指定的字符/d' $file_path