sed流编辑器

sed 是一种在线编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed命令的格式

  • sed 选项 '动作' 文件名
  • cat 文件名 | sed 选项 '动作'

选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

动作:
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容
s :替换指定内容

删除行内容

1、删除行内容删除第2行的内容

  • cat file.txt | sed '2d'
  • sed '2d' file.txt

2、删除第2-5行的内容

  • cat file.txt | sed '2,5d'
  • sed '2,5d' file.txt

3、删除第2行到最后一行的内容

  • cat file.txt | sed '2,$d'
  • sed '2,$d' file.txt

新增、插入 行内容

1、在第2行后新增内容

  • cat file.txt | sed '2a hello world'

2、在第2行前插入内容

  • cat file.txt | sed '2i hello world

3、在第2行后新增2行内容

  • cat file.txt | sed '2a hello world'

替换行内容

1、把第2行的内容替换为 hello world

  • cat file.txt | sed '2c hello world'

2、把第2-5行的内容替换为 hello world

  • cat file.txt | sed '2,5c hello world'

3、只显示被修改的行的内容

  • cat file.txt | sed -n '2c hello world'

搜索指定内容

1、搜索含有abc的行

  • cat file.txt | sed -n '/abc/p'

2、搜索并删除指定内容

  • cat file.txt | sed '/abc/d'

替换指定内容

1、默认只替换每行中模式首次匹配的内容

  • cat file.txt | sed 's/abc/'替换后的内容'/'

2、g标记可以使sed执行全局替换

  • cat file.txt | sed 's/abc/'替换后的内容'/g'

3、g标记可以使sed替换第N次出现的匹配

  • sed 's/abc/xxx/2g' file.txt

直接操作文件内容(危险动作)

1、直接删除文件内容

  • sed -i '2,5d' file

2、直接替换文件内容

  • sed -i 's/abc/xxx/g' file

在sed中使用正则表达式

1、搜索并删除空行

  • sed '/^$/d' file.txt

2、替换3位数的数字

[root@linuxprobe test_shell]# cat b.txt
a 1 b 22 c 333 d 4444
[root@linuxprobe test_shell]# sed 's/[0-9]{3}/666/g' b.txt
a 1 b 22 c 666 d 4444

[root@linuxprobe test_shell]# cat file
a1
b22
c333
d4444
ab12abc123abcd1234
[root@linuxprobe test_shell]# sed 's/[0-9]{3}/666/g' file
a1
b22
c666
d6664
ab12abc666abcd6664

3、操作文件内容时,备份原文件

[root@linuxprobe test_shell]# cat file
xxx 123 xxx123 123xxx
[root@linuxprobe test_shell]# sed -i.bak 's/abc/xxx/g' file
[root@linuxprobe test_shell]# cat file
xxx 123 xxx123 123xxx
[root@linuxprobe test_shell]# ls
b.txt  file  file.bak  test.sh
[root@linuxprobe test_shell]# cat file.bak
xxx 123 xxx123 123xxx

4、已匹配字符串标记( & )

在 sed 中 & 指代模式所匹配到的字符串

[root@linuxprobe test_shell]# cat file
abc 123 abc123 123abc
[root@linuxprobe test_shell]# sed 's/abc/[&]/g' file
[abc] 123 [abc]123 123[abc]

5、子串匹配标记( 1  2 3 ......)

在sed中 1  2 3 指代出现在括号中的部分正则表达式所匹配到的内容

[root@linuxprobe test_shell]# echo abc 123 | sed 's/abc ([0-9])/1/'
123

对于匹配到的第一个子串,其对应的标记是 1 ,匹配到的第二个子串是 2 ,往后以此类推。

[root@linuxprobe test_shell]# echo HELLO world | sed 's/([A-Z]+) ([a-z]+)/2 1/'
world HELLO

6、组合多个表达式

[root@linuxprobe test_shell]# echo abc 123 | sed 's/[a-z]+/xxx/' | sed 's/[0-9]+/666/'
xxx 666
[root@linuxprobe test_shell]# echo abc 123 | sed 's/[a-z]+/xxx/;s/[0-9]+/666/'
xxx 666
[root@linuxprobe test_shell]# echo abc 123 | sed 's/[a-z]+/xxx/;s/[0-9]+/666/'
xxx 666

7、引用变量

[root@linuxprobe test_shell]# echo user | sed "s/user/$USER/"
root

备注:在双引号中,可以引用变量。



原文地址:https://www.cnblogs.com/lfjn/p/11455970.html