文本处理三剑客之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的主要内容,如果未能解决你的问题,请参考以下文章

文本处理三剑客之sed的使用

linux文本三剑客之sed命令详解

Linux文本处理三剑客之sed

Linux文本处理三剑客之---sed

文本处理三剑客之sed

文本处理三剑客之sed