Linux命令之sed详细介绍

1. sed简介

sed全名为stream editor,是一款新型的,非交互式的编辑器。同时它也是基于数据流的方式对文本信息进行处理。sed和awk,grep被称为linux三剑客。
这三个工具都是linux下非常强大的文本处理工具。sed擅长对数据进行编辑,grep擅长搜索文本的内容,而awk则擅长处理和生成文本报表。今天我们主要来了解一下sed的常见用法有哪些?

2. sed工作原理

前面也说过了,sed在处理数据时,会逐行读取文本内容,sed会将正在处理的行保存在一个临时的缓冲区,处理完缓冲区的当前行之后会把处理后的内容显示在屏幕上,而原本的文本文件内容并不会被改变。但是sed也有特定的选项可以修改到原本的文本文件。sed的工作流程如下:
在这里插入图片描述

3. sed命令格式

sed命令格式如下:

sed [选项] [脚本命令] 文件名

来看一个简单的sed命令:

sed -n 's/hello/hi/' 1.txt

先不管这句指令是什么意思,这里可以看到一个较为完整的sed指令由上述几个部分组成:-n 对应选项; ‘s/hello/hi/’; 对应脚本命令 ;1.txt对应文件名。
事实上有时候,选项也可以不需要。

4. sed选项

不管是什么linux指令,其实复杂都是复杂在它的选项上。不同的选项有着不一样的含义和用法,sed也是如此。sed的选项多种多样,但是常见的还是那么几个,下面就列举了常见的一些sed选项。

选项含义
-n取消默认打印到屏幕上
-i直接编辑源文件的内容,并且不会输出到屏幕上
-f指定一个sed脚本到命令行执行
-e多重编辑,且命令的顺序会影响结果
-r使用扩展正则

除了上述的选项以外,还有各种操作命令。这些操作命令是写在sed命令格式中的“脚本命令"中的。其作用就是告知sed对当前行进行怎么样的处理。常用的操作命令有以下:

命令含义
p打印输入行
d删除行
s字符串替换
i在当前行前插入文本
a在当前行之后插入文本
c使用新文本覆盖当前行

5. sed命令使用实例

学编程的时候大家都是从第一个程序hello world开始的。那么学会使用sed也从hello world开始一层一层递进吧。
有如下hello.txt文件:

Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

5.1 P命令

p命令: 打印功能
p是print的缩写,意为打印。
一个最简单的p命令的使用:
例1:

sed 'p' hello.txt
=>结果:
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

打印了10句hello world。这是因为默认情况下,sed工具本身会把缓存行的内容输出在屏幕上,而p命令又将匹配到的缓存行输出了一遍。所以本来源文件5行hello world打印了10行出来。另外,需要注意的是,这里sed并没有修改到源文件。
选项-n可以取消sed默认打印输出行的功能。
例2:

sed -n 'p' hello.txt
=>结果:
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

取消了默认打印后,只有p命令打印出来的五行hello world。
当然,我们也可以对p命令的执行加以限制,只打印需要打印的行,例如,只打印2,3两行:
例3:

sed -n '2,3p' hello.txt

现在为方便查看测试结果,更改测试文件为test.txt

hello bob
hey lili
hi  sasa
bye coco

除了像上述指令那样可以直接用2,3这样的数字打印指定的行,也可以采用匹配模式来匹配对应的行并且打印,例如:
例4:

sed -n '/hello/p'  test.txt
=>结果:
hello bob

/hello/表示的是对输入行进行匹配,只有有hello的行才可以执行p命令,从测试结果也可以直观的看出。

5.2 d命令
d是delete的意思,意为删除。在sed逐行处理文本时,对于匹配的行执行d命令,删除该输入行。依旧以上述test.txt为例:
例5:

sed '/lili/d' test.txt
=>结果:
hello bob
hi  sasa
bye coco

显然,对于有lili的行就会被sed删除。
同样的,也可以直接指定删除某几行:
例6:

sed '2,$d' test.txt

说明:从第二行开始到最后一行全部删除。

5.3 替换命令:s
s命令起替换功能。其基本用法就是s/A/B/,对于每一输入行,都使用字符串B替换字符串A。举个例子:
例7:

sed 's/sasa/gaga/' test.txt
=>结果:
hello bob
hey lili
hi  gaga
bye coco

显而易见,文本中的sasa被修改成了gaga。但是源文件中的文本内容依旧是没有被修改的。
另外,对于一个输入行如果有多个匹配项时,默认情况下只会替换第一个匹配项。但是替换标志g则可以进行全局替换。
例8:

sed 's/sa/ga/' test.txt
=>结果:
hello bob
hey lili
hi  gasa
bye coco

如上可以看到没有使用替换标志g进行全局替换,则替换时只会替换第一个匹配项。
例9:

sed 's/sa/ga/g' test.txt
=>结果:
hello bob
hey lili
hi  gaga
bye coco

这样一来,两个sa都被ga替换了。

例10:

sed -n 's/sa/ga/gp' test.txt
=>结果:
hi  gaga

上例中,选项-n与替换标志p结合使用,起到了只打印发生替换的行的效果。g依然起行内全局替换效果。
在讲到替换命令s时,我们不得不将另外一个选项搬出来。前面说到,sed默认是对缓存空间的文本进行修改,并不会影响到源文件。而选项-i则可以直接修改到源文件,并且不会显示出来。
例11:

sed -i 's/sa/ga/g' test.txt
=>cat test.txt
hello bob
hey lili
hi  gaga
bye coco

查看源文件可以发现通过-i选项直接修改了源文件的内容。建议在使用-i选项前对文件进行备份。

5.4 多重编辑命令e
e是编辑命令,允许sed进行多重编辑的任务。
例12:

sed -e '1,2d' 's/ga/sa/g' test.txt
=>结果:
hi  sasa
bye coco

上述sed是这么执行的,当输入行是第一行和第二行时,执行了删除的指令。
执行第3,4行时,‘1,2d’不起效果,进入了’s/ga/sa/g’ 进行替换指令。所以通过e命令,sed执行了两重编辑的操作。但是有的时候,多重编辑任务之间不能交换顺序,如果交换顺序,最终得到的结果可能是不一样的。
例13:

cat test.txt

hello bob
hey lili
hi  gaga
bye coco

sed -e 's/coco/gaga/' -e 's/gaga/sasa/' text.txt
=>结果:
hello bob
hey lili
hi  sasa
bye sasa

修改执行顺序:
sed -e 's/gaga/sasa/' -e 's/coco/gaga/' text.txt
hello bob
hey lili
hi  sasa
bye gaga

可见,多重编辑下改变编辑命令之间的顺序可能会影响到输出。

5.5 插入命令:i
i为插入命令,会在当前行处理之前插入新的文本。
例14:

sed 'i 666' test.txt
=>结果:
666
hello bob 
666
hey lili 
666
hi  gaga 
666
bye coco

如上没有对i命令进行模式匹配,所以对在每个输入行之前都有插入新的文本。
例15:

sed '/coco/i 666' test.txt
=>结果:
hello bob
hey lili
hi  gaga
666
bye coco

对匹配到coco的行之前插入新的文本。

5.6 追加命令a
追加命令a和插入命令i有点类似,不过追加命令是在当前行处理之后追加新的文本。
例16:

sed '/hey/a 666' test.txt
=>结果:
hello bob
hey lili
666
hi  gaga
bye coco

匹配到hey的行之后,在该行处理之后追加了新的文本。

5.7 修改命令c
使用修改命令c,当匹配到合适的行之后,会使用新的内容来覆盖该行的全部信息。
例17:

sed '/coco/c  666' test.txt
=>结果:
hello bob
hey lili
hi  gaga
666

使用“666”新文本替换了原先的行。

总结

sed的用法还有很多,由于篇幅有限,这里就不一一介绍。如有兴趣,可以去到官网sed官网细细品味。我认为最关键的还是对-i选项的掌握,多写多用就会熟悉。
ps:刚前几天接到一个小任务,有个文本,大概500多行需要我修改。如果手动一行一行替换怎么也得小几十分钟 ,使用sed命令秒秒钟完事。sed真香!!

又过零点了,睡觉!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sed是一个强大的文本处理工具,常用于从标准输入或文件中读取文本,进行编辑和转换,并将输出写入标准输出或文件中。 以下是sed常用的命令选项: 1. -n:只显示经过sed编辑的行 2. -i:直接修改文件内容,不输出到终端 3. -e:允许多个命令一起执行 4. -f:从文件中读取sed命令进行处理 以下是sed常用的命令: 1. s:替换。语法为:s/要替换的内容/替换后的内容/g,其中g表示全局替换。 2. p:打印。将指定的行或所有行输出到终端。 3. d:删除。删除指定的行或所有行。 4. a:追加。在指定行后面添加新的内容。 5. i:插入。在指定行前面插入新的内容。 6. w:写入。将指定行写入到文件中。 举例说明: 1. 将文件中的所有"cat"替换为"dog":sed -i 's/cat/dog/g' file.txt 2. 只显示文件中包含“hello”的行:sed -n '/hello/p' file.txt 3. 删除文件中的第3行:sed -i '3d' file.txt 4. 在文件中第2行后面添加一行内容:“hello world”:sed -i '2a hello world' file.txt 5. 将文件中第1行替换为“hello”并保存到另一个文件中:sed '1s/.*/hello/' file.txt > newfile.txt ### 回答2: sed是一种常用的Linux命令,其全称为Stream Editor,用于对文本进行处理和转换。它可以在命令行中以各种方式对文件内容进行修改,包括替换、插入、删除、追加等操作。 sed的基本语法是`s/old/new/`,其中old表示待替换的字符串,new表示替换后的内容。sed命令会读取文件的内容,并对匹配到的old进行替换。如果需要对整个文件进行替换,则需要加上选项`-i`。 除了替换以外,sed还可以实现很多其他的文本操作。例如,通过`d`选项可以删除匹配到的行;通过`i`选项可以在指定行前插入文本;通过`a`选项可以在指定行后追加文本等。 另外,sed命令还可以使用正则表达式来进行模式匹配。通过在替换语句中使用正则表达式,可以对符合特定模式的字符串进行批量替换。 总之,sed是一种非常强大和灵活的文本处理工具,可以方便地对文件内容进行修改和转换,提高工作效率。熟练掌握sed命令可以帮助我们更好地处理和编辑文本文件。 ### 回答3: sed(Stream Editor)是Linux中常用的文本处理工具之一。它可以对文本进行流式编辑,具体操作包括查找、删除、替换、插入行或字符等。 使用sed命令的基本语法为: ``` sed [选项] '动作' 文件名 ``` 其中,选项可以包括: - -n:只显示或处理特定行; - -e:指定要执行的动作; - -f:从指定文件中读取动作。 动作部分可以包括: - 数字n:表示打印第n行; - p:打印匹配行; - d:删除匹配行; - s/old/new/:查找并替换文本; - a\text:在匹配行后插入文本; - i\text:在匹配行前插入文本。 以下是一些常用的sed命令示例: - 打印文件内容: ``` sed 'p' file.txt ``` - 删除匹配行: ``` sed '/pattern/d' file.txt ``` - 查找并替换文本: ``` sed 's/old/new/' file.txt ``` - 打印指定行数: ``` sed -n 'n' file.txt ``` - 在匹配行后插入文本: ``` sed '/pattern/a\text' file.txt ``` - 在匹配行前插入文本: ``` sed '/pattern/i\text' file.txt ``` 通过灵活运用sed命令,我们可以轻松地对文本文件进行各种编辑操作,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值