记录一下常用的sed 的 要点
sed 的执行过程:
In default operation, sed cyclically copies a line of input, less its terminating newline character, into a pattern space (unless there is something left after a D command), applies in sequence all commands whose addresses select that pattern space, and at the end of the script copies the pattern space to standard output (except when -n is specified) and deletes the pattern space. Whenever the pattern space is written to standard output or a named file, sed will immediately follow it with a newline character.
Some of the commands use a hold space to save all or part of the pattern space for subsequent retrieval. The pattern and hold spaces will each be able to hold at least 8192 bytes.
--------------------------------------------------------------------
重要的 空间名词:
input : 输入 一般指 待处理的文件
pattern space: ‘模式空间' sed 利用命令对读入的每行进行处理的 ‘空间’
output: 打印出来的空间
hold space:Some of the commands use a hold space to save all or part of the pattern space for subsequent retrieval.
貌似是 sed 执行过程中用来 临时存储和替换的空间! 只有 g G h H x 五个命令用到.
从 g,和G 的效果来看,默认为空行什么也没有。 sed g file,则file有多少行,就会打印出多少空行...
options:
-n:
Suppress the default output (in which each line, after it is examined for editing, is written to standard output). Only lines explicitly selected for output will be written.
解析:默认的,sed 每处理一行都打印到stdout, 有了 -n,之后,则只打印“选择了”的行,
如: sed -n ‘/holy/p’ file,只打印 有 /holy/ 选择的行
没有-n, /holy/选则的行会被打印两遍,一遍默认,一遍是'p'的效果!
而sed -n 's/holy/shit/g' file, 什么都打印! p命令表示"explicitly selected for output", 其余默认都不打印
-f:
用来使用脚本跑sed命令
The script_files named by the -f option will consist of editing commands, one per line.
如: sed -f xxx file, xxx内容为's/holy/shit/g'
script 格式的注解:
The script consists of editing commands, one per line, of the following form:
[address[,address]]command[arguments]
Zero or more blank characters are accepted before the first address and before command.
address这个词会多次出现,大概表示“定址”的意思?
Addresses in sedAn address is either empty, a decimal number that counts input lines cumulatively across files, a "$" character that addresses the last line of input, or a context address (which consists of a regular expression as described in Regular Expressions in sed ,
preceded and followed by a delimiter, usually a slash). A command line with no addresses selects every pattern space.
A command line with one address selects each pattern space that matches the address.
A command line with two addresses selects the inclusive range from the first pattern space that matches the first address to the next pattern space that matches the second. (If the second address is a number less than or equal to the line number first selected, only one line will be selected.) Starting at the first line following the selected range, sed looks again for the first address. Thereafter the process is repeated.
Editing commands can be applied only to non-selected pattern spaces by use of the negation command "!"
command list:
Two of the commands take a command-list, which is a list of sed commands separated by newline characters, as follows:
{ command
command
. . .
}
The "{" can be preceded with blank characters and can be followed with white space. The commands can be preceded by white space. The terminating "}" must be preceded by a newline character and then zero or more blank characters.
类似
a \
text (append text) ,表示写法上在 slash'\'后换行,然后写要插入的text
(
这些需要换行的写法一般出现在script里面吧,直接命令行不常用,有些偏高级)
N : 读入下一行, (吧下一行和当前 pattern space 行的内容以 \n 连接起来,改变文件的行号)
Append the next line of input to the pattern space, using an embedded newline character to separate the appended material from the original material. Note that the current line number changes.
D Delete up to the first embedded newline in the pattern space. Start next cycle, but skip reading from the input if there is still data in the pattern space.
删除直到遇到第一个 \n,"
p to the first embedded newline"(删除的内容包括\n)。如果之前用了 N,命令,达到了两行拼接后
删除前行的效果
待补充...
------------------------------------------------------------------
关于 , 和 ;
, 用于两个 addrees之间, 如:
1,10 1到10行
/begin/,/end/
1,10! ' ! ' 表示去饭,即 1,10 之外的行
-----
; 对于没一个读入pattern space后,以 ; 为命令为分隔,依次执行各个命令
如 sed -n '/aa/,/cc/ n; p' hhh
其中,hhh文件内容为
holy
aa#
bb#
cc#
dd#
shit
则输出:
holy
bb#
dd#
shit
奇怪吧? 解释。
1 sed 首先读入第一行 'holy' 到 patternspace, 第一个命令 /aa/,/cc/ n, 地址被过滤,不应用于该行,第二个命令 p 打印其到 stdout,因此看到holy打印
2 第二个cycle开始,读入 aa# 到pattern space,满组 /aa/,/cc/ 地址过滤,命令n起效,效果1:Write the pattern space to standard output if the default output has not been suppressed,意图打印 该行到stdout,但是被 -n 参数屏蔽,| 随后n命令的效果2 replace the pattern space with the next line of input-- 替换pattern space下一行 bb# ,| 之后第二个命令p,打印出 bb#
3 第三个cycle开始,注意此时sed不是读取第 bb#, 而是读取 cc#,说明在第二个cycle中,n的效果2消耗了行。并影响了下一个cycle。 也可以理解为 input里面的东西只允许被“拿出”一次, cursor是始终往前的! 显示,cycle3打印出 dd#4 cycle 4 打印 shit,如 cycle1
;与 -e, ; 分隔的命令对对 pattern space中的"一行"(引号表示实际可能影响了几行,如N命令) 做连续处理。 而 -e,则是对文本处理完一遍之后,接着开始下一轮,如:
sed -e 's/#.*//' -e '/^$/ d'
Removing comments and blank lines takes two commands. The first removes every character from the "#" to the end of the line, and the second deletes all blank lines.
(这些玩意好像使用用不上啊,理解起来还挺费劲....)
------------------------------------------------------------------
references:
1 http://pubs.opengroup.org/onlinepubs/007908799/xcu/sed.html
这篇简要而基础! 非常棒!
附带扩展:unix使用工具的参数规则:
http://pubs.opengroup.org/onlinepubs/007908799/xbd/utilconv.html#usg
看完这个也许对阅读man手册有帮助
2 中文参考手册:
http://www.tsnc.edu.cn/tsnc_wgrj/doc/sed.htm
3 一个更详细的tutorial e文
http://www.grymoire.com/Unix/Sed.html#uh-64
详细,浅显易懂!
4 http://sed.sourceforge.net/sed1line_zh-CN.html
这里面提供了一些示例,解释不清楚(但是正确),考验自己理解的好地方!
分享到:
相关推荐
### Linux Shell Sed 学习笔记:深入理解与实践 #### Sed 概览 Sed(Stream Editor)是一种功能强大的文本处理工具,适用于Unix/Linux环境下的流编辑操作。它能够读取输入流(如文件或标准输入),进行模式匹配、...
### Sed学习笔记详解 #### 1. Sed简介 Sed(Stream Editor)是一种强大的文本处理工具,主要用于在线编辑文本文件。它能够一次性处理文件中的一行内容,将每一行存储在一个临时区域,即“模式空间”(Pattern ...
Sed学习笔记,介绍所有sed命令,和具体用法
sed与awk(第二版)学习笔记
sed awk 学习笔记 SED 是一个“非交互式”的面向字符流的编辑器,它可以在一个地方指定所有的编辑指令,然后通过文件传递一次来执行他们。但是它在每次多于一行的处理能力方面有限制。SED 的优点是可以批量处理文件...
### sed 高级用法详解 #### 一、sed简介 **sed**(Stream EDitor)是一种强大的文本处理工具,主要用于自动化地对文本文件进行编辑。它以行为单位处理文本,适用于以下几种情况: 1. **处理大型文件**:对于那些不...
在awk中,预定义的变量包括输入分隔符(FS)、输出分隔符(OFS)、输入记录分隔符(RS)、输出记录分隔符(ORS)、当前字段数(NF)、当前记录号(NR)、文件内记录号(FNR)和参数数量(ARGC)。自定义变量可通过-v...
### 知识点概述 **sed和awk工具的介绍与应用** sed和awk是广泛应用于UNIX系统中的两...通过本书的学习,用户可以掌握sed和awk的基础知识和高级应用,并能够将这些工具应用于日常的工作中,以提高处理文本数据的效率。
Sed与awk(第二版)这本书作为国外的经典教材,经过翻译后,为中文读者学习这些工具提供了极大的便利。它不仅系统地介绍了sed和awk的使用方法,还通过实例演示了如何编写有效的脚本来处理文本数据。对于那些希望提高...
学习Sed和Awk可以显著提升UNIX和Linux操作效率,对于开发者、系统管理员、数据库管理员或IT管理员来说是非常重要的技能。掌握这些工具,意味着能够快速地进行文本处理、数据提取和报告生成,解决很多日常工作中遇到...
### grep、sed、awk命令实例大练习 在Linux或Unix环境中,`grep`、`sed`和`awk`是三个非常强大的文本处理工具。通过掌握这些工具的基本用法及高级功能,用户可以高效地处理各种文本文件。下面将详细介绍如何使用...
为了使读者能够更好地学习和实践sed和awk,作者们提供了sedawk2progs这个包含所有书中例程和源代码的压缩包。通过这个压缩包,读者可以下载并运行这些程序,直观地了解它们是如何工作的,进而对这些程序进行修改和...
3. 字段和记录:`awk`中的字段分隔符和`NF`变量,以及`sed`中的行处理。 4. 正则表达式:在`awk`和`sed`中如何使用正则表达式进行模式匹配。 5. 内置函数:`awk`的数学和字符串函数,以及`sed`的内置命令。 6. 脚本...
本手册介绍了sed和awk两种文本处理工具,它们是Unix和类Unix系统下强大的文本处理工具,广泛应用于编辑文本、...本手册是sed和awk学习者的宝贵资源,通过掌握手册中的知识,可以大幅提升文本处理的效率和自动化水平。
压缩包内的`sed命令使用.docx`、`Sed命令学习笔记.pdf`、`sed使用手册.pdf`都是非常好的学习资料,它们将更深入地讲解sed命令的高级用法,包括模式匹配的细节、流编辑的技巧以及在实际工作中的应用案例。通过阅读...
### sed和awk工具详解 #### 一、引言 在Linux和Unix系统中,文本处理是一项常见的需求。其中,`sed`(stream editor)和`awk`是两款非常强大的文本处理工具,...这本书是学习`sed`和`awk`的绝佳资源,建议深入阅读。
### AWK命令详解 **AWK** 是一种强大的文本处理工具,在 Unix 和类 Unix 操作系统中非常常见。它能够方便地对文本进行格式化、提取数据或执行...通过深入学习这两种工具的功能,可以极大地提高处理文本文件的效率。