Linux三剑客学习笔记——sed

Linux中文本处理的3把瑞士军刀sed,awk和grep,在我看来grep偏向于偏向于对匹配到的内容进行提取统计,awk偏向于对匹配到的内容进行格式化,而sed偏向于对匹配到的内容进行编辑。

​ 本文档主要介绍sed命令的常用简单用法,高级用法需要深入理解sed的实现原理,本文不深入,即学即用。学习sed命令要求开发者首先要了解正则表达式,sed在实际应用中常常结合正则表达式使用。sed常用于shell脚本的编写,实现文本自动化变更。

一、sed常用格式

Linux三剑客学习笔记——sed_第1张图片

常用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

你可能感兴趣的:(Linux,linux,正则表达式,shell,脚本语言)