文本处理三剑客之sed
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本处理三剑客之sed相关的知识,希望对你有一定的参考价值。
sed基本内容介绍
sed的概念及作用:
sed默认只处理模式空间,不处理原数据,它主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
sed的命令格式:
sed [option] ‘command‘ filename
sed的命令格式与一般的命令稍显不同,sed命令后还需要一条命令,我们可以将‘command’这部分理解为sed处理文本时需要的一个动作,比如打印,删除……等。此外,sed命令是默认输出的,即sed将文本处理之后,会默认的把处理过的文本输出在终端上。
sed基本用法
sed的常见选项
-n : 一般情况下,sed是默认输出,但加上-n选项之后,sed则不会将结果输出在终端上。
-i : ,而不是输出在终端上
-e : 允许sed同时进行多个动作
sed的选项要和命令搭配使用,sed处理文本还需要如下的动作。
sed常用动作
a : 追加,a的后面可以接字符串,而且这些字符会在本行的下一行出现 (如下图:在第2行下追加"add hello")
i : 插入,和a的作用相似,只不过输出的字符会出现在本行的上一行(如下图,在第一行上面追加“hello i”)
p : 以行为单位显示,通常p会与参数sed -n一起作用,表示只输出sed处理的行数据。
sed在使用p命令时,我们可以有多种分割方式来输出我们想要的结果
- sed -n ‘#p‘ filename #表示数字,因为配合-n,所以结果输出第#行的内容
- sed -n ‘#~2p‘ filename 表示从第#行开始,每隔两行输出一次
- sed -n ‘#,+np‘ filename 表示从第#行开始,以下的n行全部输出
- sed -n ‘/string/p‘ file 表示输出含有字符串string的行
- sed -n ‘/string1/,/string2/p‘ 表示输出字符string1到string2的所有行
d : 删除一行
d的用法和p的用法相同,都可以用相同的表示方法进行输出和删除操作
sed的进阶用法
刚刚上面提到的都是sed的基本用法,接下来要说的是sed在处理文本中经常用到的很重要的用法
替换
指定替换行的内容
有时候我们仅需要对某些进行替换,可以在命令中指定行:
# 只对第3行进行替换
sed -i ‘3s/string1/string2/g‘ filename
#只对第3-6行进行替换
sed -i ‘3,6s/string1/string2/g‘ filename
多个匹配
如果要对一行进行两个匹配,可以在命令字符串中使用;分割多个匹配项:
sed ‘1,3s/string1/string2/g; 3,$s/string3/string4/g‘ filename
#上述等同如下:
sed -e ‘1,3s/string/string2/g‘ -e ‘3,$s/string3/string4/g‘ filename
括号匹配(类似于分组与后向引用)
sed ‘s/this is (string)/1/g‘ filename
分组及后向引用
sed -r ‘s/this is (string)/1/g‘ filename
sed高阶用法
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行
h
拷贝模板块的内容到内存中的缓冲区。
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
具体用法如下:seq 1 8
seq 1 8 |sed -n ‘n;p‘ 输出偶数行
seq 1 10 |sed ‘1!G;h;$!d‘ 或 seq 1 10 |sed -n ‘1!G;h;$p‘ 倒序输出
seq 1 10 |sed ‘N;D‘ 或 seq 1 10 |sed ‘$!d‘ 只输出最后一行
seq 1 10 |sed ‘$!N;$!D‘ 输出倒数后两行
seq 1 10 |sed ‘G‘ 每行后加一个空行
seq 1 10 |sed ‘g‘ 所有行变为空行
cat seq.txt |sed ‘/^$/d;G‘ 空行删除,每行后加一个空行,即保证每
行后只有一个空行``
seq 1 10 |sed ‘n;d‘ 只显示奇数行
结语
sed能够完美的配合正则表达式使用,功能不同凡响,所以对正则的学习是很重要的。
以上是关于文本处理三剑客之sed的主要内容,如果未能解决你的问题,请参考以下文章