`

《Unix Shell 实例精解》学习笔记之sed篇

阅读更多
《Unix Shell 实例精解》学习笔记之sed篇
1.sed命令简介
sed是流线型、非交互式编辑器。它允许你执行与vi和ex编辑器里一样的编辑任务。Sed 程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。
2.sed工作原理
sed编辑器按一次处理一行的方式来处理文件,并把输出送到屏幕上。
3.sed 可以用寻址的方式来决定想要编辑哪一行。
4.sed 命令和选项
命令 功能
a\ 在当前行上添加一个文本行或者多个文本行
c\ 用新闻本改变(取代)当前行里的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间内容复制到一个固定缓存
H 把模式空间内容添加到一个固定缓存
g 得到固定缓存里所有的禀复制到模式缓存,重写其内容
G 得到固定缓存的内容并复制到模式缓存,添加到里面
I 列出不打印的字符
p 打印行
n 读下一输入行,并开始用下一个命令处理换行符,而不是用第一个命令
q 结束或退出sed
r 从一个文件读如行
! 把命令应用到除了选出的行以外的其他所有行
s 把一个字串替换成另一个
替换标志
g 在一行上进行全局替换
p 打印行
w 把行写到一个文件中
x 用模式空间的内容交换固定缓存的内容
y 把一个字符转换成另一个(不能和整则表达式元字符一起使用)
5.sed元字符
    基本上,grep和vi使用的元字符都可以用在sed中。下表列出了一些特别的sed元字符:
元字符 &                           
功能 保存搜索串以便可以记在替换串里
例子    s/love/**&**/
解释    &号代表搜索串。串love将被星号包围的自身所替代;即love变成**love**
6. sed 的实例(使用datafile)
datafile内容如下:
northwest NW Charles Main      3.0 .98 3 34
western   WE Sharon Gray      5.3 .97 5 23
southwest SW Lewis Dalsass      2.7 .8 2 18
southern SO Suan Chin      5.1 .95 4 15
southeast SE      Patricia Hemenway    4.0 .7 4 17
eastern EA TB Savage       4.4 .84 5 20
northeast NE AM Main Jr.       5.1 .94 3 13
north    NO Margot Weber       4.5 .89 5 9
central CT Ann Stephens         5.7 .94 5 13
1> 打印:p命令
sed '/north/p' datafile
默认输出所有行,找到north的行重复打印
sed –n '/north/p' datafile
禁止默认输出,只打印找到north的行
2> 删除:d命令
sed '3d' datafile
删除第三行,其余行输出到屏幕
sed '3,$d' datafile
从第3行到最后一行都删除,将剩余部分输出到屏幕
sed '/north/d' datafile
将含有north的行删除,其余输出到屏幕
3> 替换:s命令
sed 's/west/north/g' datafile
解释:找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。
sed 's/[0-9][0-9]$/&.5/' datafile
解释:在替代串里的&字符代表在搜索串中真正找到的。每个以两个数字结尾的行都被它自己取代,且要在后面加上.5
sed -n 's/Hemenway/Jones/gp' datafile
解释:所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。-n与p命令选项相结合来禁止默认输出。g代表全局替换
sed -n 's/\(Mar\)got/\1ianne/p' datafile
解释:模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。在替换串里它将被引用做\1。然后用Marianne替代Margot。
sed 's#3#88#g' datafile
解释:s命令后面的字符是搜索串和替换串之间的分界符。默认的分界符是一个正斜杠,但也可以改变(只有使用s命令时)。无论s命令后面跟什么字符,它都是新的串分界符。当搜索包含一个正斜杠的模式,如路径或生日时,这种技巧可能有用的 ^V^
4> 被选中的行的范围:逗号
sed -n '/west/,/east/p' datafile
解释:打印在west和east之间的模式范围内所有行。如果west出现在east之后,则打印从west到下一个east或者到文件末尾的行,无论哪种情况先出现都可以。
sed '/west/,/east/s/$/**VACA**/' datafile
解释:对于在模式west到east范围内的行,行末尾将用**VACA**来取代。
5> 多次编辑 -e 选项
sed -e '1,3d' -e 's/Hemenway/Jones/' datafile
-e选项允许多次编辑。不同的编辑顺序可能导致不同的结果。
例如,如果两个命令都执行了替换,第一次替换可能影响第二次替换。
6> 从文件中读取:r命令
sed '/Suan/r newfile' datafile
解释:r命令从newfile中读取内容,将内容输出到Suan的后面。如果datafile中Suan出现的次数不只一次,则分别放到Suan的后面。
7> 写入文件:w命令
sed -n '/north/w newfile' datafile
解释:w命令把指定的行写入到一个文件。本例中所有的包含north的行写入到newfile中。
等同于 sed -n '/north/p' datafile > newfile
8> 添加:a命令
$ sed '/north/a\
> ---->THE NORTH SALES DISTRICT HAS MOVED<-----' datafile
northwest NW Charles Main      3.0 .98 3 34
---->THE NORTH SALES DISTRICT HAS MOVED<-----
western WE Sharon Gray      5.3 .97 5 23
southwest SW Lewis Dalsass      2.7 .8 2 18
southern SO Suan Chin      5.1 .95 4 15
southeast SE      Patricia Hemenway    4.0 .7 4 17
eastern EA TB Savage       4.4 .84 5 20
northeast NE AM Main Jr.       5.1 .94 3 13
---->THE NORTH SALES DISTRICT HAS MOVED<-----
north    NO Margot Weber       4.5 .89 5 9
---->THE NORTH SALES DISTRICT HAS MOVED<-----
central CT Ann Stephens         5.7 .94 5 13
    解释:红颜色的内容是要输入的内容。a\命令后面跟要添加的内容。奇怪的是a\后面必须另起一行,在输入要添加的内容,否则会提示命令错乱,真是搞不懂。
9> 插入:i命令
$ sed '/north/i\
> ---->THE NORTH SALES DISTRICT HAS MOVED<-----' datafile
---->THE NORTH SALES DISTRICT HAS MOVED<-----
northwest NW Charles Main      3.0 .98 3 34
---->THE NORTH SALES DISTRICT HAS MOVED<-----
western WE Sharon Gray      5.3 .97 5 23
southwest SW Lewis Dalsass      2.7 .8 2 18
southern SO Suan Chin      5.1 .95 4 15
southeast SE      Patricia Hemenway    4.0 .7 4 17
eastern EA TB Savage       4.4 .84 5 20
---->THE NORTH SALES DISTRICT HAS MOVED<-----
northeast NE AM Main Jr.       5.1 .94 3 13
---->THE NORTH SALES DISTRICT HAS MOVED<-----
north    NO Margot Weber       4.5 .89 5 9
central CT Ann Stephens         5.7 .94 5 13
10>下一个:n命令
$ sed '/eastern/{n;s/AM/Archie/;}' datafile
northwest NW Charles Main      3.0 .98 3 34
western WE Sharon Gray      5.3 .97 5 23
southwest SW Lewis Dalsass      2.7 .8 2 18
southern SO Suan Chin      5.1 .95 4 15
southeast SE      Patricia Hemenway    4.0 .7 4 17
eastern EA TB Savage       4.4 .84 5 20
northeast NE AM Main Jr.       5.1 .94 3 13
......
解释:如果在某一行里模式eastern被匹配,n命令使sed区的下一行,用该行带换模式空间,用Archie替换AM,打印并继续。
11>变换:y 命令
% sed '1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/' datafile
解释:将对应字母进行转换。
12>退出:q命令
% sed '5q' datafile
解释:在打印了5行之后,用q命令退出sed程序。
13>保存和取得:h和G命令
$ sed -e '/southeast/h' -e '$G' datafile
northwest NW Charles Main      3.0 .98 3 34
western   WE Sharon Gray      5.3 .97 5 23
southwest SW Lewis Dalsass      2.7 .8 2 18
southern SO Suan Chin      5.1 .95 4 15
southeast SE      Patricia Hemenway    4.0 .7 4 17
eastern EA TB Savage       4.4 .84 5 20
northeast NE AM Main Jr.       5.1 .94 3 13
north    NO Margot Weber       4.5 .89 5 9
central CT Ann Stephens         5.7 .94 5 13
southeast SE      Patricia Hemenway    4.0 .7 4 17
解释:当sed处理文件时,每行都存在模式空间(pattern space)的临时缓存中。除非行被禁止打印或删除,否则行将在处理完后被打印到屏幕,然后请模式空间并把下一输入行保存在那里等待处理。在这个例子中,在找到模式之后,把它放在模式空间里,而且h命令复制它并把它存到另一个叫做保存缓存(holding buffer)中。
第二个sed指令里,当读入最后一行($)时,G命令告诉sed从包存缓存中取得该行并放回模式空间缓存,添加到当前存在那里的行中。本例子就是最后一行。
$ sed -e '/WE/{h;d;}' -e '/CT/G' datafile
northwest NW Charles Main      3.0 .98 3 34
southwest SW Lewis Dalsass      2.7 .8 2 18
southern SO Suan Chin      5.1 .95 4 15
southeast SE      Patricia Hemenway    4.0 .7 4 17
eastern EA TB Savage       4.4 .84 5 20
northeast NE AM Main Jr.       5.1 .94 3 13
north    NO Margot Weber       4.5 .89 5 9
central CT Ann Stephens         5.7 .94 5 13
western WE Sharon Gray      5.3 .97 5 23
解释:第一个命令h将找到了WE的行放到保存缓存中,然后删除该行;第二个命令/CT/G就是在找到了CT的行的后面加入保存缓存的内容。
14>G和g的区别
    G命令在符合的条件行后面添加保存缓存中的内容;g命令用保存缓存中的内容覆盖符合条件的行。
15>sed 命令的花括号{}的作用
   花括号{}中可以放入多个命令,每个命令后面要用分号;。
16>保存和交换:h 和 x命令。
$ sed -e '/Patricia/h' -e '/Margot/x' datafile
northwest NW Charles Main    3.0 .98 3 34
western WE Sharon Gray    5.3 .97 5 23
southwest SW Lewis Dalsass   2.7 .8 2 18
southern SO Suan Chin          5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage          4.4 .84 5 20
northeast NE AM Main Jr.          5.1 .94 3 13
southeast SE Patricia Hemenway 4.0 .7 4 17
central   CT Ann Stephens          5.7 .94 5 13
解释:x命令将找到的行用保存缓存中的内容替换。
7. 用sed来编写命令表
     sed 命令表(script)是文件里的一个sed命令列表。用-f选项来引用一个命令表文件。编辑sed命令表有特殊要求:命令末尾不能有任何为岁的空白符或者文本。如果命令不是自成一行,就必须用分号结束。在源代码chap4目录下有两个编辑好的命令表文件(sedding1和sedding2)可以参考。
   下面是使用sed命令表的例子。
$ sed -f sedding1 datafile
EMPLOYEE DATABASE
---------------------
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
Lewis is the TOP Salesperson for April!!
Lewis is moving to the southern district next month.
CONGRATULATIONS!
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
*******************
        MARGOT HAS RETIRED
*******************
8. Sed练习参考答案
    练习内容参考databook文件
1〉 把Jon改成Jonathan
sed 's/Jon/Jonathan/' datebook
2〉 删除头3行
sed '1,3d' datebook
3〉 打印5—10行
sed -n '5,10p' datebook
4〉 删除包含Lane的行
sed '/Lane/d' datebook
5〉 打印所有生日是在Noverber到December之间的行
sed -n '/:1[12]\//p' datebook
6〉 把三个星添加到以Fred开头的行尾
sed '/^Fred/s/$/***/' datebook
7〉 用JOSE HAS RETIRED取代包含Jose的行
sed 's/^Jose[0-9]*[a-z]*[A-Z]* *.*$/JOSE HAS LEFT/' datebook
8〉 把Popeye的生日改成11/14/46
sed '/Popeye/s/:[0-9]*[0-9]*\/[0-9]*[0-9]*\/[0-9]*[0-9]*/:11\/14\/46/' datebook
9〉 删除所有空白行 sed '/^$/d' datebook 10〉 写一个sed命令表,将:
a. 在第1行之前插入标题PERSONNEL FILE
b. 删除以500结尾的工资
c. 打印文件内容,把姓和名颠倒
d. 在文件末尾添加THE END
答案放在chap04/a10文件中,内容如下:
# My first sed script by Wangzhh.
1i\
分享到:
评论

相关推荐

    Unix+shell+实例精解 学习笔记

    《Unix Shell 实例精解》是一本专注于Unix操作系统与Shell编程的学习笔记,它以其丰富的实战案例为亮点,帮助读者深入理解和掌握Unix环境下的命令行操作与脚本编程技巧。Unix Shell是Unix系统中的一个交互式命令解释...

    《UnixShell实例精解》-学习笔记.doc

    UnixShell实例精解

    《Unix Shell 实例精解》学习笔记(pdf,清晰)

    《Unix Shell 实例精解》是一本专注于Unix Shell编程的深度学习资料,旨在帮助读者掌握这一强大而灵活的命令行工具。Unix Shell是Linux和Unix操作系统中的一个命令解释器,它为用户提供了与操作系统交互的界面,允许...

    《Unix Shell 实例精解》学习笔记

    ### Unix Shell 实例精解 — 学习笔记关键知识点概览 #### 第一章:关于UNIX Shell的介绍 - **Shell定义**: - Shell是一种作为用户与内核(即UNIX操作系统的核心)之间的桥梁的特殊程序。 - 常见的Shell类型...

    linux_shell实例精解

    "Linux Shell实例精解"这本书籍正是针对这个主题,为初学者提供了丰富的学习资源。 在Linux世界中,Shell扮演着至关重要的角色。它不仅用于执行单个命令,还能通过脚本进行批量处理、文件操作、系统管理、数据处理...

    《unix shell 实例精解》学习笔记

    ### Unix Shell 实例精解——关键知识点概览 #### 第一章 关于UNIX Shell的介绍 **1.1 Shell 的定义** - **概念**: Shell 是一种特殊的程序,它作为用户与 Unix 操作系统核心(内核)之间的接口,提供了一个交互...

    UNIX Shell实例精解

    《UNIX Shell实例精解》是一本专为学习和精通UNIX Shell而编写的教材,它深入浅出地通过实例解析了Shell的各种用法和技巧。UNIX Shell作为UNIX操作系统中的一种命令解释器,是用户与系统交互的重要工具,尤其对于...

    《Unix Shell 实例精解》学习笔记.docx

    ### Unix Shell 实例精解——关键知识点概览 #### 一、Unix Shell 概述 - **定义**:Shell 是一种特殊程序,充当用户与 Unix 操作系统内核之间的交互界面。用户通过输入命令来控制操作系统的行为。常用的 Shell ...

    UNIX shell范例精解(第4版)

    标题中提到的《UNIX shell范例精解(第4版)》表明这本书是一本关于UNIX shell编程的书籍,而且已经发行到了第四版,说明该书有一定的受众基础和受欢迎程度。UNIX shell是UNIX和类UNIX操作系统(比如Linux)中用于控制...

    UNIX Shell awk sed 实例 精解 (第4版)

    在"UNIX Shell awk sed 实例 精解 (第4版)"这本书中,你将发现丰富的实例来帮助你理解这些工具的实际应用。书中的内容可能包括: 1. Bash Shell的基本语法和高级特性,如变量、流程控制、脚本调试等。 2. awk的模式...

    UNIX Shell 实例精解 第二版

    《UNIX Shell 实例精解 第二版》这本书深入探讨了UNIX环境下的shell编程技术,同时结合awk、sed和grep这三个强大的文本处理工具,为读者提供了全面的UNIX系统操作和脚本编写知识。以下是对这些核心知识点的详细解析...

    《unix shell 实例精解》

    ### Unix Shell 实例精解 —— 关键知识点详解 #### 一、Unix Shell 概述 **1. 定义** Unix Shell 是一种用于与 Unix 操作系统进行交互的特殊程序,它作为用户与内核之间的接口,允许用户通过命令行输入指令来...

    unix shell范例精解

    《Unix Shell范例精解》是一本专注于Unix操作系统中Shell编程的经典著作,主要涵盖了Unix的基础知识和Shell脚本的编写技巧。Unix系统是早期计算机领域的重要操作系统,至今仍在科研、工程和开发环境中广泛使用。...

    UNIX shell范例精解(第4版).pdf

    《UNIX Shell范例精解(第4版)》是一本深度探讨UNIX系统中shell编程的专著,由清华大学出版社出版。这本书旨在帮助读者理解和掌握在UNIX环境中如何利用shell进行高效的工作和开发。UNIX shell作为UNIX操作系统的...

    unix shell 范例精解 卷 4 中文pdf版

    unix shell 范例精解 卷4 中文pdf版 以及书上的源码.

    unix shell 实例精解(第二版)

    《Unix Shell实例精解(第二版)》是一本专注于Unix Shell编程和命令行操作的权威指南。本书旨在帮助读者深入理解和熟练运用Unix Shell,提升在命令行环境下的工作效率。Unix Shell作为Unix和类Unix系统中不可或缺的...

    UNIX.shell范例精解(第4版)中文清晰带书签.part2.rar

    UNIX.shell范例精解(第4版)中文清晰带书签,一共2部分,一起下载解压缩,详细介绍了UNIX下的包括bash等脚本编程

    UNIX Shell 实例精解

    对c、Bourne和Korn Shell及Awk、Sed和Grep的全面指导。

Global site tag (gtag.js) - Google Analytics