Linux常用命令之sed(2)

Sed

  • SED的英文全称是 Stream EDitor,它是一个简单而强大的文本解析转换工具,在1973-1974年期间由贝尔实验室的Lee E. McMahon开发,今天,它已经运行在所有的主流操作系统上了。
  • McMahon创建了一个通用的行编辑器,最终变成为了SED。SED的很多语法和特性都借鉴了ed编辑器。设计之初,它就已经支持正则表达式,SED可以从文件中接受类似于管道的输入,也可以接受来自标准输入流的输入。
  • SED由自由软件基金组织(FSF)开发和维护并且随着GNU/Linux进行分发,因此,通常它也称作 GNU SED。对于新手来说,SED的语法看起来可能有些神秘,但是,一旦掌握了它的语法,你就可以只用几行代码去解决非常复杂的任务,这就是SED的魅力所在。

DESCRIPTION

工作流

  1. 读取: SED从输入流(文件,管道或者标准输入)中读取一行并且存储到它叫做 模式空间(pattern buffer) 的内部缓冲区
  2. 执行: 默认情况下,所有的SED命令都在模式空间中顺序的执行,除非指定了行的地址,否则SED命令将会在所有的行上依次执行
  3. 显示: 发送修改后的内容到输出流。在发送数据之后,模式空间将会被清空。
  4. 在文件所有的内容都被处理完成之前,上述过程将会重复执行

注意

  • 模式空间 (pattern buffer) 是一块活跃的缓冲区,在sed编辑器执行命令时它会保存待检查的文本
  • 默认情况下,所有的SED命令都是在模式空间中执行,因此输入文件并不会发生改变
  • 还有另外一个缓冲区叫做 保持空间 (hold buffer),在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。在每一个循环结束的时候,SED将会移除模式空间中的内容,但是该缓冲区中的内容在所有的循环过程中是持久存储的。SED命令无法直接在该缓冲区中执行,因此SED允许数据在 保持空间 和 模式空间之间切换
  • 初始情况下,保持空间 和 模式空间 这两个缓冲区都是空的
  • 如果没有提供输入文件的话,SED将会从标准输入接收请求
  • 如果没有提供地址范围的话,默认情况下SED将会对所有的行进行操作

语法

sed [-n] [-e] 'command(s)' files
sed [-n] -f scriptfile files
  • 第一种方式在命令行中使用单引号指定要执行的命令
  • 第二种方式则指定了包含SED命令的脚本文件。

当然,这两种方法也可以同时使用,SED提供了很多参数用于控制这种行为。
让我们看看如何指定多个SED命令。SED提供了delete命令用于删除某些行,这里让我们删除第一行,第二行和第五行:

$ cat books.txt
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

使用Sed移除指定的行,删除三行,使用-e选项指定三个独立的命令

# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 6) A Game of Thrones, George R. R. Martin, 864
sed -e '1d' -e '2d' -e '5d' books.txt

将多个SED命令写在一个文本文件中,然后将该文件作为SED命令的参数,SED可以对模式空间中的内容执行文件中的每一个命令

echo -e "1d\n2d\n5d" > commands.txt
# 1d
# 2d
# 5d
cat commands.txt
# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 6) A Game of Thrones, George R. R. Martin, 864
sed -f commands.txt books.txt

标准选项

-n

  • 默认情况下,模式空间中的内容在处理完成后将会打印到标准输出,该选项用于阻止该行为

    # 1) A Storm of Swords, George R. R. Martin, 1216
    # 2) The Two Towers, J. R. R. Tolkien, 352
    # 3) The Alchemist, Paulo Coelho, 197
    # 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
    # 5) The Pilgrimage, Paulo Coelho, 288
    # 6) A Game of Thrones, George R. R. Martin, 864
    sed '' books.txt

    -e

  • 指定要执行的命令,使用该参数,我们可以指定多个命令
    # 1) A Storm of Swords, George R. R. Martin, 1216
    # 2) The Two Towers, J. R. R. Tolkien, 352
    # 3) The Alchemist, Paulo Coelho, 197
    sed -n -e '1p' -e '2p' -e '3p' books.txt

-f

  • 指定包含要执行的命令的脚本文件

GNU选项

-n, –quiet, –slient

  • 与标准的-n选项相同

-e script,–expression=script

  • 与标准的-e选项相同

-f script-file, –file=script-file

  • 与标准的-f选项相同

–follow-symlinks

  • 如果提供该选项的话,在编辑的文件是符号链接时,SED将会跟随链接

    -i[SUFFIX],–in-place[=SUFFIX]

  • 该选项用于对当前文件进行编辑,如果提供了SUFFIX的话,将会备份原始文件,否则将会覆盖原始文件

-l N, –line-lenght=N

  • 该选项用于设置行的长度为N个字符

–posix

  • 该选项禁用所有的GNU扩展

-r,–regexp-extended

  • 该选项将启用扩展的正则表达式

-u, –unbuffered

  • 指定该选项的时候,SED将会从输入文件中加载最少的数据,并且更加频繁的刷出到输出缓冲区。在编辑tail -f命令的输出,你不希望等待输出的时候该选项是非常有用的。

-z,–null-data

  • 默认情况下,SED对每一行使用换行符分割,如果提供了该选项的话,它将使用NULL字符分割行

模式空间和保持空间

模式空间

$ vim books.txt
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho,288
6) A Game of Thrones, George R. R. Martin, 864

执行p命令

$ sed 'p' books.txt
1) A Storm of Swords, George R. R. Martin, 1216
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
6) A Game of Thrones, George R. R. Martin, 864

被显示了两次!

默认情况下,SED将会输出模式空间中的内容,另外,我们的命令中包含了输出命令p,因此每一行被打印两次。但是不要担心,SED提供了-n参数用于禁止自动输出模式空间的每一行的行为

$ sed -n 'p' books.txt
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

行寻址

默认情况下,在SED中使用的命令会作用于文本数据的所有行。如果只想将命令作用于特定的行或者某些行,则需要使用 行寻址 功能。

  • 数字形式表示的行区间
  • 文本模式来过滤行
[address]command
数字方式的行寻址
# 3) The Alchemist, Paulo Coelho, 197
sed -n '3p' books.txt
#2---5
sed -n '2,5 p' books.txt
# 6) A Game of Thrones, George R. R. Martin, 864
sed -n '$ p' books.txt
# 第三行到最后一行
sed -n '3,$ p' books.txt
# M, +n 将会打印出从第M行开始的下n行
sed -n '2,+4 p' books.txt
# M~N的形式,它告诉SED应该处理M行开始的每N行,50~5匹配行号50,55,60,65
# 奇数行
sed -n '1~2 p' books.txt
# 偶数行
sed -n '2~2 p' books.txt 
文本模式过滤器
/pattern/command

必须用正斜线将要指定的pattern封起来。sed编辑器会将该命令作用到包含指定文本模式的行上。

# 3) The Alchemist, Paulo Coelho, 197
# 5) The Pilgrimage, Paulo Coelho, 288
sed -n '/Paulo/ p' books.txt

# 第一次匹配到Alchemist开始输出,直到第5行为止。
# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
sed -n '/Alchemist/, 5 p' books.txt

# 使用逗号(,)操作符指定匹配多个匹配的模式。下列的示例将会输出Two和Pilgrimage之间的所有行
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
sed -n '/Two/, /Pilgrimage/ p' books.txt

# 第一次Two出现的位置开始输出接下来的4行
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed -n '/Two/, +4 p' books.txt 

保持空间

在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。有5条命令可用来操作保持空间

  • h 将模式空间复制到保持空间
  • H 将模式空间附加到保持空间
  • g 将保持空间复制到模式空间
  • G 将保持空间附加到模式空间
  • x 交换模式空间和保持空间的内容
# 1) A Storm of Swords, George R. R. Martin, 1216 , 2) The Two Towers, J. R. R. Tolkien, 352
# - 3) The Alchemist, Paulo Coelho, 197 , 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# - 5) The Pilgrimage, Paulo Coelho, 288 , 6) A Game of Thrones, George R. R. Martin, 864
sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt

删除命令 d

[address1[,address2]]d

address1address2是开始和截止地址,它们可以是行号或者字符串匹配模式,这两种地址都是可选的。

#
sed 'd' books.txt

# 移除第四行
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '4d' books.txt 

# 移除N1到N2行
# 1) A Storm of Swords, George R. R. Martin, 1216
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '2, 4 d' books.txt   

# 除所有作者为Paulo Coelho的书籍
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 6) A Game of Thrones, George R. R. Martin, 864
sed '/Paulo Coelho/d' books.txt 

# 移除所有以Storm和Fellowship开头的行
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '/Storm/,/Fellowship/d' books.txt  

文件写入命令 w

[address1[,address2]]w file

w指定是写命令, file指的是存储文件内容的文件名。使用file操作符的时候要小心,当提供了文件名但是文件不存在的时候它会自动创建,如果已经存在的话则会覆盖原文件的内容。

# 创建文件books.txt的副本,在 w 和 file 之间只能有一个空格
sed -n 'w books.bak' books.txt
#
diff books.txt books.bak
# 会存储文件中的偶数行到另一个文件
sed -n '2~2 w zing.txt' books.txt
# 2) The Two Towers, J. R. R. Tolkien, 352
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 6) A Game of Thrones, George R. R. Martin, 864
cat zing.txt
# 存储所有独立作者的书到单独的文件
sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w Tolkien.txt' books.txt
# 1) A Storm of Swords, George R. R. Martin, 1216
# 6) A Game of Thrones, George R. R. Martin, 864
cat Martin.txt
# 3) The Alchemist, Paulo Coelho, 197
# 5) The Pilgrimage, Paulo Coelho, 288
cat Paulo.txt
# 2) The Two Towers, J. R. R. Tolkien, 352
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
cat Tolkien.txt
追加命令 a
[address]a\
Append text
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 7) Adultry, Paulo Coelho, 234
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt

# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
# 7) Adultry, Paulo Coelho, 234
sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt

# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 7) Adultry, Paulo Coelho, 234
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt  
行替换命令 c

SED通过 c 提供了 change 和 replace 命令,该命令帮助我们使用新文本替换已经存在的行,当提供行的地址范围时,所有的行都被作为一组被替换为单行文本,下面是该命令的语法

[address1[,address2]]c\
Replace text
# 替换文本中的第三行为新的内容
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) Adultry, Paulo Coelho, 324
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

# 接受模式作为地址
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) Adultry, Paulo Coelho, 324
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864
sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt

# 将第4-6行内容替换为单行
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 4) Adultry, Paulo Coelho, 324
sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt 
插入命令 i

插入命令与追加命令类似,唯一的区别是插入命令是在匹配的位置前插入新的一行。

[address]i\
Insert text
# 1) A Storm of Swords, George R. R. Martin, 1216
# 2) The Two Towers, J. R. R. Tolkien, 352
# 3) The Alchemist, Paulo Coelho, 197
# 7) Adultry, Paulo Coelho, 324
# 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
# 5) The Pilgrimage, Paulo Coelho, 288
# 6) A Game of Thrones, George R. R. Martin, 864

原文地址:https://www.cnblogs.com/zhangrxiang/p/8535291.html

时间: 2024-10-08 05:13:20

Linux常用命令之sed(2)的相关文章

Linux常用命令之sed

标题:sed命令的使用 作用:sed是以行为单位处理文本数据,可以对数据按行进行选取(显示).替换.删除和新增等功能. 一.用法 sed [-nefr] [动作] 参数: -n:使用安静模式,取消自动打印模式空间.在一般来自STDIN的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed处理的那一行才会被列出来.       -e:直接在命令行模式上进行sed的动作编辑.       -f:直接将sed动作写到一个文件内,-f filename可以执行filename内的sed动作

Linux常用命令:sed

本文记录的是自己在学习<Linux私房菜>中正则表达式的笔记. 关于行尾符$ 如果文件本身没有内容,比如使用touch新建的文件,那么$将会没有意义.例如下面操作: 先使用touch新建了一个test.txt文件,然后尝试使用sed命令去在行尾增加内容,但是没有成功(紧接着的cat命令没有输出任何东西),然后我使用vim给test.txt手动增加了一行内容“add by vim”,然后再使用同样的sed命令就成功了,如后续cat命令输出结果. 命令sed sed是一个十分有用的管道命令,功能很

Linux常用命令大全

系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验

(转)linux常用命令

原地址:http://www.cnblogs.com/svage/p/3700122.html 1.删除目录及子目录下的 .svn目录 find . -type d -name ".svn" | xargs rm -rf 2./tmp 目录的权限 drwxrwxrwt rwt的意思是:对目录有执行权限,但不能删除,即sticky bit rwx : 可读可写可执行 4+2+1 3.改变群组.用户.权限 chgrp   群组名   改变的目录 groupadd -g gid gname

linux常用命令整理(五):shell基础

大家好,我是会唱歌的程序猿------ 最近在学习linux,闲暇之余就把这些基本的命令进行了整理,希望大家能用的上,整理的的目的是在忘了的时候翻出来看看^?_?^,前后一共分为五个部分: linux基本命令整理(一):常用命令 地址:http://www.cnblogs.com/devinCat/p/7247824.html linux基本命令整理(二):用户.用户组.文件系统和网络 地址:http://www.cnblogs.com/devinCat/p/7247847.html linux

Linux常用命令收集

Linux常用命令:if.for.which.ps.grep.netstat.lsof.head.tail.sed.awk.cut.sort.uniq.dos2unix.find.xargs.kill) 一.linux查看占用内存/cpu最高的进程情况(注明:可以使用一下命令查使用内存最多的10个进程) 1.查看占用cpu最高的进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head 2.查看占用内存最高的进程 ps aux|head -1

linux常用命令技巧

原文地址 这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>-- Linux用户有哪些应该知道的提高效率的技巧.我觉得挺好的,总结得比较好,把其转过来,并加了一些自己的理解. 首先,我想告诉大家,在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化.如果你看过<你可能不知道的Shell>以及<28个Unix/Linu

Linux常用命令小结(续)

20. mysql mysql --host=127.0.0.1 --port=3306 --database=test --user=test --password=test --default-character-set=utf8 21. 脚本求两个文件的相同集合 test1   test2 1           2 2           3 3           4 cat test1 test2 | sort | uniq -d (result: 2 3) cat test1 te

Linux常用命令速查备忘

Linux常用命令速查备忘 PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown] 停止系统 [halt] 停止系统 [reboot] 重启动 [poweroff] 切断电源 [sync] 把内存里的内容写入磁盘 [lilo] 安装lilo启动管理程序 [grub] 安装lilo启动管理程序 二. Shell相关命令 [chsh] 切换Shell [history] 显示命令履历