Linux中最常用的三大文本处理工具之sed

1.sed简介

Sed是一款流编辑工具,用来对文本进行过滤与替换操作,Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合于处理大数据文件。首先,Sed通过文件或管道读取文件内容,但Sed默认并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space),所有的指令操作都是在模式空间中进行的,然后Sed根据相应的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出(即屏幕上)。
工作流程如图:
image

2.语法格式

Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理。
sed [选项]...{脚本指令} [输入文件]

命令参数:

  • -n:使用安静(silent)模式。所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来(只打印模式空间中的内容);
  • -e: 允许多个脚本指令被执行
  • -f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;
  • -r:sed 的动作支持的是延伸型正规表示法的语法;
  • -i:in place editing 直接修改读取的文件内容,而不是输出到终端;

3.脚本指令

脚本指令需要指定一个地址来决定操作范围,如果不指定,则默认对文件的所有行进行操作。
基本格式 :
[地址]命令

  • a :append 新增, a的后面可以接字串, 新增到当前行的下一行。
  • i : insert 插入, i 的后面可以接字串,插入到当前行的上一行;
  • d :delete 删除,因为是删除,所以 d 后面通常不接任何咚咚;
  • p :print 打印,亦即将某个选择的数据打印出来。通常 p 会与参数 sed -n 一起运行。
  • s :substitute 替代,通常这个 s 的动作可以搭配正规表示法,例如 s/old/new/g ,后面的参数g: global 代表替换作用于全局的每一行。如果没有g,则至替换每行出现的第一个匹配字符。

更多的指令大全如图:

imge

地址的匹配语法
image

4.常用操作小结

(1)插入

  • 在第n行后插入TYPE=Ethernet
    sed '2a TYPE=Ethernet' test.txt
  • 在第二行前插入TYPE=Ethernet
    sed '2i TYPE=Ethernet' test.txt
  • 匹配到包含ONBOOT的行,并在其后添加TYPE=Ethernet
    sed '/ONBOOT/a TYPE=Ethernet' test.txt

(2)删除

删除指令需要注意以下几点:
(1)删除只能删除整行,如果删除部分需要用替换。
(2)删除指令用于删除匹配的行,而且删除命令还会改变sed脚本中命令的执行顺序。因为匹配的行一旦删除,模式空间将变为“空”,自然不会再执行sed脚本后续的命令。删除命令将导致读取新的输入行(下一行),而sed脚本中的命令则从头开始重新执行。

  • 删除第二行
    sed '2d ' test.txt
  • 删除2-8行
    sed '2,8d' test.txt
  • 删除空行
    /^$/d

(3)打印

  • 打印文件的第3行
    sed -n '3p' test.txt
  • 打印奇数行
    sed -n '1~2p' test.txt

(4)替换

指令格式:[address]s/pattern/replacement/flags

address为操作地址,s为替换指令,/pattern/匹配需要替换的内容,/replacement为替换的新内容。
Flags标记可以是:
image
replacement为字符串,用来替换与正则表达式匹配的内容。在replace部分,只有下列字符有特殊含义:
image
示例 :

(5)更改

注意更改是会把整行更改,替换只会替换匹配的内容。

  • 将包含ONBOOT行的内容更改为ONBOOT=no
    sed '/ONBOOT/c ONBOOT=no' test.txt

(6)执行多个指令

如果想要一次执行多个指令,主要有以下两种方法:
(1)使用分号隔开使用

  • sed 's/a/b/g;s/c/d/g' text.txt

(2)使用-e 选项

  • sed -e 's/yes/no/' -e 's/static/dhcp/' test.txt

5. 一些比较复杂的示例

  1. 把将样本文件中第二个替换为
    样本文件:
    image
    指令文件:
    image
    先匹配/body/ ,然后替换成//body/,最后2 表示的是匹配该行的第二个字符串.后面的指令可以用花括号括起来。
    执行结果:
    image

2.给每行前一个的h1,h2等添加<>,后一个h1,h2添加</>

样本文件:
image
指令文件:
image
先匹配/h[0-9/ ,然后替换成/\<&\>/1,/\/\<&\>/2,其中& 表示前面匹配的字符串,常用于在原有字符串上增加字符。
执行结果:
image

参考链接:https://blog.csdn.net/qq_37931597/article/details/86505723

猜你喜欢

转载自www.cnblogs.com/laiyaling/p/12786401.html