Linux文本处理之sed

发布时间 2023-08-13 22:54:45作者: 百里骑

上次我们介绍了awk的用法,今天我接着了解sed的功能和用法。

Sed可按照脚本命令来处理和编辑文件,简化对文件的重复性操作。

命令格式

sed命令格式:sed [options] 'command' file(s);

sed脚本格式: sed [options] -f scriptfile file(s);

选项参数

 -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
 
 -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
 
 -i :直接修改文件内容[慎用!修改源文件!];
 
 -n :或--quiet或--silent,只打印模式匹配的行;
 
 -r :支持扩展表达式;
 
 -h或--help:显示帮助;
 
 -V或--version:显示版本信息。

动作参数

a :新增, 在当前行下面插入文本;
c :取代, 把选定的文本改为新的文本!
d :删除, 删除指定的行;
i :插入, 在当前行上面插入文本;
p :打印, 亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行;
s :替换, 替换指定字符,搭配正则表达式;
g : 全文匹配;

案例

创建测试文件sed.txt, 如下:

$ cat sed.txt
Today is a good day, a sunny day, a wonderful day, a important day.
I am a boy, a good boy, a lovely boy.
I like reading, sports, and coding.
Enjoy coding.

1 查找

查找字符串'good'

匹配到的整行都会打印;

$ sed -n '/good/p' sed.txt
Today is a good day, a sunny day, a wonderful day, a important day.
I am a boy, a good boy, a lovely boy.

2 替换操作

1 使用替换参数s, 将文本中的 ’a‘ 替换成 ’b‘;

4 sed 's/a/b/' sed.txt
Todby is a good day, a sunny day, a wonderful day, a important day.
I bm a boy, a good boy, a lovely boy.
I like rebding, sports, and coding.
Enjoy coding.

在没有添加其他参数的情况下,我们注意到:

  1. 只有每一行的第一个匹配到的字符被替换了,其他没有;比如第一行,只有today被替换成了todby;
  2. 字符匹配,而不是单词匹配,所以today中的a被匹配到;
  3. 替换之后的文件全部输出,即便存在没有匹配到的行;
  4. 原文件没有被修改

2 只输出发生替换的行(-n和p结合使用)

$ sed -n 's/a/b/p' sed.txt
Todby is a good day, a sunny day, a wonderful day, a important day.
I bm a boy, a good boy, a lovely boy.
I like rebding, sports, and coding.

3 全文替换(动作参数g)

文本中所有的a都被替换了,并不只是每行的第一个被替换;

$ sed -n 's/a/b/gp' sed.txt
Todby is b good dby, b sunny dby, b wonderful dby, b importbnt dby.
I bm b boy, b good boy, b lovely boy.
I like rebding, sports, bnd coding.

4 直接修改原文件(选项参数-i, 慎用

$ sed -i 's/a/b/g' sed.txt
$ cat sed.txt
Todby is b good dby, b sunny dby, b wonderful dby, b importbnt dby.
I bm b boy, b good boy, b lovely boy.
I like rebding, sports, bnd coding.
Enjoy coding.

3 新增/删除操作

1 在第二行后天添加一行'that is true'

$ sed '2a that is true' sed.txt
Today is a good day, a sunny day, a wonderful day, a important day.
I am a boy, a good boy, a lovely boy.
that is true
I like reading, sports, and coding.
Enjoy coding.

2 删除第2~4行

结合nl命令和管道显示出行号;

$ nl sed.txt | sed '2,4d'
1  Today is a good day, a sunny day, a wonderful day, a important day.