sed 实例
来源:互联网 发布:mac最新系统 编辑:程序博客网 时间:2024/06/09 18:57
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
-
2. 定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
-
. Sed命令
调用sed命令有两种形式:
-
sed [options] 'command' file(s)
-
sed [options] -f scriptfile file(s)
- a/
在当前行后面加入一行文本。
- b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
- c/
用新的文本改变本行的文本。
- d
从模板块(Pattern space)位置删除行。
- D
删除模板块的第一行。
- i/
在当前行上面插入文本。
- h
拷贝模板块的内容到内存中的缓冲区。
- H
追加模板块的内容到内存中的缓冲区
- g
获得内存缓冲区的内容,并替代当前模板块中的文本。
- G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
- l
列表不能打印字符的清单。
- n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
- N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
- p
打印模板块的行。
- P(大写)
打印模板块的第一行。
- q
退出Sed。
- r file
从file中读行。
- t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
- T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
- w file
写并追加模板块到file末尾。
- W file
写并追加模板块的第一行到file末尾。
- !
表示后面的命令对所有没有被选定的行发生作用。
- s/re/string
用string替换正则表达式re。
- =
打印当前行号码。
- #
把注释扩展到下一个换行符以前。
- 以下的是替换标记
-
g表示行内全面替换。
-
p表示打印行。
-
w表示把行写入一个文件。
-
x表示互换模板块中的文本和缓冲区中的文本。
-
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
-
-
选项
- -e command, --expression=command
允许多台编辑。
- -h, --help
打印帮助,并显示bug列表的地址。
- -n, --quiet, --silent
取消默认输出。
- -f, --filer=script-file
引导sed脚本文件名。
- -V, --version
打印版本和版权信息。
-
元字符集
- ^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
- $
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
- .
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
- *
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
- []
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
- [^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
- /(../)
保存匹配的字符,如s//(love/)able//1rs,loveable被替换成lovers。
- &
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
- /<
锚定单词的开始,如://<love/匹配包含以love开头的单词的行。
- />
锚定单词的结束,如/love/>/匹配包含以love结尾的单词的行。
- x/{m/}
重复字符x,m次,如:/0/{5/}/匹配包含5个o的行。
- x/{m,/}
重复字符x,至少m次,如:/o/{5,/}/匹配至少有5个o的行。
- x/{m,n/}
重复字符x,至少m次,不多于n次,如:/o/{5,10/}/匹配5--10个o的行。
-
实例
- 删除:d命令
-
$ sed '2d' example-----删除example文件的第二行。
-
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
-
$ sed '$d' example-----删除example文件的最后一行。
-
$ sed '/test/'d example-----删除example文件所有包含test的行。
-
- 替换:s命令
-
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
-
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
-
$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。
-
$ sed -n 's//(love/)able//1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
-
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
-
- 选定行的范围:逗号
-
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
-
$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
-
$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
-
- 多点编辑:e命令
-
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
-
$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
-
- 从文件读入:r命令
-
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
-
- 写入文件:w命令
-
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
-
- 追加命令:a命令
-
$ sed '/^test/a//--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
-
- 插入:i命令
$ sed '/test/i//
new line
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
- 下一个:n命令
-
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
-
- 变形:y命令
-
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
-
- 退出:q命令
-
$ sed '10q' example-----打印完第10行后,退出sed。
-
- 保持和获取:h命令和G命令
-
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
-
- 保持和互换:h命令和x命令
-
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
-
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
-
在sed的命令行中引用shell变量时要使用双引号,而不是通常所用的单引号。下面是一个根据name变量的内容来删除named.conf文件中zone段的脚本:
name='zone/ "localhost"'sed "/$name/,/};/d" named.conf
转载自:IBM developerWorks 中国网站
在本文章系列中,Daniel Robbins 将为您演示如何使用功能十分强大(但常被遗忘)的 UNIX 流编辑器 sed。sed 是用批处理方式编辑文件或以十分有效的方式创建 shell 脚本以修改现有文件的理想工具。
在 UNIX 世界中有很多文本编辑器可供我们选择。思考一下 -- vi、emacs 和 jed 以及很多其它工具都会浮现在脑海中。我们都有自己已逐渐了解并且喜爱的编辑器(以及我们喜爱的组合键)。有了可信赖的编辑器,我们可以轻松处理任何数量与 UNIX 有关的管理或编程任务。
如果可以使编辑文件的过程自动化,以便用“批处理”方式编辑文件,甚至编写可以对现有文件进行复杂更改的脚本,那将太好了。幸运的是,对于这种情况,有一种更好的方法 -- 这种更好的方法称为 "sed"。
对 Linux 用户来说幸运的是,最好的 sed 版本之一恰好是 GNU sed,其当前版本是 3.02。每一个 Linux 发行版都有(或至少应该有)GNU sed。GNU sed 之所以流行不仅因为可以自由分发其源代码,还因为它恰巧有许多对 POSIX sed 标准便利、省时的扩展。另外,GNU 没有 sed 早期专门版本的很多限制,如行长度限制 -- GNU 可以轻松处理任意长度的行。
在研究这篇文章之时我注意到:几个在线 sed 爱好者提到 GNU sed 3.02a。奇怪的是,在ftp.gnu.org(有关这些链接,请参阅参考资料)上找不到 sed 3.02a,所以,我只得在别处寻找。我在alpha.gnu.org 的 /pub/sed 中找到了它。于是我高兴地将其下载、编译然后安装,而几分钟后我发现最新的 sed 版本却是 3.02.80 -- 可在alpha.gnu.org 上 3.02a 源代码旁边找到其源代码。安装完 GNU sed 3.02.80 之后,我就完全准备好了。
alpha.gnu.org(请参阅参考资料)是新的和实验性 GNU 源代码的所在地。然而,您还会在那里发现许多优秀、稳定的源代码。出于某种原因,不是许多 GNU 开发人员忘记将稳定的源代码移至 ftp.gnu.org,就是它们的 "beta" 期间格外长(2 年!)。例如,sed 3.02a 已有两年,甚至 3.02.80 也有一年,但它们仍不能(在 2000 年 8 月写本文章时)在 ftp.gnu.org 上获得。
在本系列中,将使用 GNU sed 3.02.80。在即将出现的本系列后续文章中,某些(但非常少)最高级的示例将不能在 GNU sed 3.02 或 3.02a 中使用。如果您使用的不是 GNU sed,那么结果可能会不同。现在为什么不花些时间安装 GNU sed 3.02.80 呢?那样,不仅可以为本系列的余下部分作好准备,而且还可以使用可能是目前最好的 sed。
sed 通过对输入数据执行任意数量用户指定的编辑操作(“命令”)来工作。sed 是基于行的,因此按顺序对每一行执行命令。然后,sed 将其结果写入标准输出 (stdout),它不修改任何输入文件。
$ sed -e 'd' /etc/services
下面是使用 sed 从输出流除去 /etc/services 文件第一行的示例:
$ sed -e '1d' /etc/services | more
现在,让我们看一下如何指定地址范围。在本例中,sed 将删除输出的第 1 到 10 行:
$ sed -e '1,10d' /etc/services | more
现在演示一个更有用的示例。假设要查看 /etc/services 文件的内容,但是对查看其中包括的注释部分不感兴趣。如您所知,可以通过以 '#' 字符开头的行在 /etc/services 文件中放置注释。为了避免注释,我们希望 sed 删除以 '#' 开始的行。以下是具体做法:
$ sed -e '/^#/d' /etc/services | more
可以使用规则表达式来表示可能会在文本中发现的模式。您在 shell 命令行中用过 '*' 字符吗?这种用法与规则表达式类似,但并不相同。下面是可以在规则表达式中使用的特殊字符:
与行首匹配
与行末尾匹配
与任一个字符匹配
将与前一个字符的零或多个出现匹配 [ ] 与 [ ] 之内的所有字符匹配
表达式 描述 /./ 将与包含至少一个字符的任何行匹配 /../ 将与包含至少两个字符的任何行匹配 /^#/ 将与以 '#' 开始的任何行匹配 /^$/ 将与所有空行匹配 /}^/ 将与以 '}'(无空格)结束的任何行匹配 /} *^/ 将与以 '}' 后面跟有零或多个空格结束的任何行匹配 /[abc]/ 将与包含小写 'a'、'b' 或 'c' 的任何行匹配 /^[abc]/ 将与以 'a'、'b' 或 'c'开始的任何行匹配
$ sed -e '/regexp/d' /path/to/my/test/file | more
$ sed -n -e '/regexp/p' /path/to/my/test/file | more
目前为止,我们已经看到了行地址、行范围地址和 regexp 地址。但是,还有更多的可能。我们可以指定两个用逗号分开的规则表达式,sed 将与所有从匹配第一个规则表达式的第一行开始,到匹配第二个规则表达式的行结束(包括该行)的所有行匹配。例如,以下命令将打印从包含 "BEGIN" 的行开始,并且以包含 "END" 的行结束的文本块:
$ sed -n -e '/BEGIN/,/END/p' /my/test/file | more
如果只要打印 C 源文件中的 main() 函数,可输入:
$ sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c | more
既然已经触及了基本知识,我们将在后两篇文章中加快步伐。如果想看一些更丰富的 sed 资料,请耐心一些 -- 马上就有!同时,您可能想查看下列 sed 和规则表达式资源。
有关 sed:
- 阅读 developerWorks 上 Daniel 的其它 sed 文章:通用线程:sed 实例,第 2 部分和第 3 部分。
- 查看 Eric Pement 极佳的 sed FAQ。
- 可以在 ftp://ftp.gnu.org/pub/gnu/sed 找到 sed 3.02 资源。
- 将在 alpha.gnu.org 找到很好的新的 sed 3.02.80。
- 另外,Eric Pement 还有一些方便的 sed 单行程序,任何有抱负的 sed 高手都应该看一下。
- 如果想看好的老式书籍,O'Reilly 的 sed & awk, 2nd Edition 将是极佳选择。
- 可能想阅读 7th edition UNIX's sed man page(大概 1978!)。
- 阅读 Felix von Leitner 短小的 sed tutorial。
- 在 developerWorks 上阅读 David Mertz 的 "Text processing in Python"。
转载自:IBM developerWorks 中国网站
sed 是十分强大和小巧的文本流编辑器。在本文章系列的第二篇中,Daniel Robbins 为您演示如何使用 sed 来执行字符串替换、创建更大的 sed 脚本以及如何使用 sed 的附加、插入和更改行命令。
让我们看一下 sed 最有用的命令之一,替换命令。使用该命令,可以将特定字符串或匹配的规则表达式用另一个字符串替换。下面是该命令最基本用法的示例:
$ sed -e 's/foo/bar/' myfile.txt
$ sed -e 's/foo/bar/g' myfile.txt
$ sed -e '1,10s/enchantment/entrapment/g' myfile2.txt
$ sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt
$ sed -e 's:/usr/local:/usr:g' mylist.txt
目前为止,我们只执行了简单的字符串替换。虽然这很方便,但是我们还可以匹配规则表达式。例如,以下 sed 命令将匹配从 '<' 开始、到 '>' 结束、并且在其中包含任意数量字符的短语。下例将删除该短语(用空字符串替换):
$ sed -e 's/<.*>//g' myfile.html
<b>This</b> is what <b>I</b> meant.
meant.
This is what I meant.
$ sed -e 's/<[^>]*>//g' myfile.html
'[ ]' 规则表达式语法还有一些附加选项。要指定字符范围,只要字符不在第一个或最后一个位置,就可以使用 '-',如下所示:
'[a-x]*'
我们已经看到如何执行简单甚至有些复杂的直接替换,但是 sed 还可以做更多的事。实际上可以引用匹配规则表达式的部分或全部,并使用这些部分来构造替换字符串。作为示例,假设您正在回复一条消息。下例将在每一行前面加上短语 "ralph said: ":
$ sed -e 's/.*/ralph said: &/' origmsg.txt
ralph said: Hiya Jim, ralph said: ralph said:
I sure like this sed stuff! ralph said:
's///' 命令甚至比 '&' 更好,它允许我们在规则表达式中定义区域,然后可以在替换字符串中引用这些特定区域。作为示例,假设有一个包含以下文本的文件:
foo bar oni eeny meeny miny larry curly moe jimmy the weasel
'.* .* .*'
'/(.*/) /(.*/) /(.*/)'
$ sed -e 's//(.*/) /(.*/) /(.*/)/Victor /1-/2 Von /3/' myfile.txt
Victor foo-bar Von oni Victor eeny-meeny Von miny Victor larry-curly Von moe Victor jimmy-the Von weasel
在开始创建更复杂的 sed 脚本时,需要有输入多个命令的能力。有几种方法这样做。首先,可以在命令之间使用分号。例如,以下命令系列使用 '=' 命令和 'p' 命令,'=' 命令告诉 sed 打印行号,'p' 命令明确告诉 sed 打印该行(因为处于 '-n' 模式)。
$ sed -n -e '=;p' myfile.txt
$ sed -n -e '=' -e 'p' myfile.txt
$ sed -n -f mycommands.sed myfile.txt
有时,可能要指定应用到一个地址的多个命令。这在执行许多 's///' 以变换源文件中的字和语法时特别方便。要对一个地址执行多个命令,可在文件中输入 sed 命令,然后使用 '{ }' 字符将这些命令分组,如下所示:
1,20{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g }
1,/^END/{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g p }
既然在单独的文件中编写 sed 脚本,我们可以利用附加、插入和更改行命令。这些命令将在当前行之后插入一行,在当前行之前插入一行,或者替换模式空间中的当前行。它们也可以用来将多行插入到输出。插入行命令用法如下:
i/ This line will be inserted before each line
This line will be inserted before each line line 1 here
This line will be inserted before each line line 2 here
This line will be inserted before each line line 3 here
This line will be inserted before each line line 4 here
i/ insert this line/ and this one/ and this one/ and, uh, this one too.
a/ insert this line after each line. Thanks! :)
c/ You're history, original line! Muhahaha!
在下一篇、也是本 sed 系列的最后一篇文章中,我将为您演示许多使用 sed 来完成不同类型任务的极佳实例。我将不仅为您显示脚本做些什么,还显示为什么那样做。完成之后,您将掌握更多有关如何在不同项目中使用 sed 的极佳知识。到时候见!
- 阅读 developerWorks 上 Daniel 的其它 sed 文章:通用线程:sed 实例,第 1 部分和第 3 部分。
- 查看 Eric Pement 极佳的 sed faq。
- 可以在 ftp.gnu.org 找到 sed 3.02 资源。
- 将在 alpha.gnu.org 找到很好的新的 sed 3.02.80。
- 另外,Eric Pement 还有一些方便的 sed 单行程序,任何有抱负的 sed 高手都应该看一下。
- 如果想看好的老式书籍,O'Reilly 的 sed & awk, 2nd Edition 将是极佳选择。
- 可能想阅读 7th edition UNIX's sed man page(大概 1978!)。
- 阅读 Felix von Leitner 短小的 sed tutorial。
- 在 using regular expressions 中复习,发现和修改这个免费 dW 独家教程文本中的模式。
转载自:IBM developerWorks 中国网站
在这篇 sed 系列的总结性文章中,Daniel Robbins 带您体验 sed 的真正力量。在介绍完几个重要的 sed 脚本之后,他将通过将一个 Quicken .QIF 文件转换成可读文本格式来演示一些基本 sed 脚本的编写。该转换脚本不仅实用,而且还是展现 sed 脚本编写能力的极佳示例。
在第二篇 sed 文章中,我提供了一些示例来演示 sed 的工作原理,但是它们当中很少有示例能实际做特别有用的事。在这篇 sed 系列的最后文章中,我要改变那种方式,并使用 sed 来做实际的事。我将为您显示几个示例,它们不仅演示 sed 的能力,而且还做一些真正巧妙(和方便)的事。例如,在本文的后半部,将为您演示如何设计一个 sed 脚本来将 .QIF 文件从 Intuit 的 Quicken 金融程序转换成具有良好格式的文本文件。在那样做之前,我们将看一下不怎么复杂但却很有用的 sed 脚本。
第一个实际脚本将 UNIX 风格的文本转换成 DOS/Windows 格式。您可能知道,基于 DOS/Windows 的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行。有时可能需要将某些 UNIX 文本移至 Windows 系统,该脚本将为您执行必需的格式转换。
$ sed -e 's/$//r/' myunix.txt > mydos.txt
下面是另一个方便的小脚本。与大多数 Linux 发行版中包括的 "tac" 命令一样,该脚本将反转文件中行的次序。"tac" 这个名称可能会给人以误导,因为 "tac" 不反转行中字符的位置(左和右),而是反转文件中行的位置(上和下)。用 "tac" 处理以下文件:
foo bar oni
首先,该脚本包含三个由分号隔开的单独 sed 命令:'1!G'、'h' 和 '$!d'。现在,需要好好理解用于第一个和第三个命令的地址。如果第一个命令是 '1G',则 'G' 命令将只应用第一行。然而,还有一个 '!' 字符 -- 该 '!' 字符忽略该地址,即,'G' 命令将应用到除第一行之外的所有行。'$!d' 命令与之类似。如果命令是 '$d',则将只把 'd' 命令应用到文件中的最后一行('$' 地址是指定最后一行的简单方式)。然而,有了 '!' 之后,'$!d' 将把 'd' 命令应用到除最后一行之外的所有行。现在,我们所要理解的是这些命令本身做什么。
过去几个星期,我一直想买一份
在查看 QIF 格式之前,先看一下我的 checkbook.txt 格式:
28 Aug 2000 food - - Y Supermarket 30.94 25 Aug 2000 watr - 103 Y Check 103 52.86
T<交易量>
N<支票号>
P<描述>
^ (这是字段分隔符)
在处理象这样重要的 sed 项目时,不要气馁 -- sed 允许您将数据逐渐修改成最终形式。在进行当中,可以继续细化 sed 脚本,直到输出与预期的完全一样为止。无需在试第一次时就保证其完全正确。
1d /^^/d s/[[:cntrl:]]//g
s/^D/(.*/)//1/tOUTY/tINNY/t/
s/^01/Jan/ s/^02/Feb/
s/^03/Mar/ s/^04/Apr/
s/^05/May/ s/^06/Jun/
s/^07/Jul/ s/^08/Aug/
s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/
s:^/(.*/)//(.*/)//(.*/):/2 /1 /3: }
现在进一步细化:
1d /^^/d s/[[:cntrl:]]//g /^D/ {
s/^D/(.*/)//1/tOUTY/tINNY/t/
s/^01/Jan/ s/^02/Feb/
s/^03/Mar/ s/^04/Apr/
s/^05/May/ s/^06/Jun/
s/^07/Jul/ s/^08/Aug/
s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/
s:^/(.*/)//(.*/)//(.*/):/2 /1 /3:
N N N
s//nT/(.*/)/nN/(.*/)/nP/(.*/)/NUM/2NUM/t/tY/t/t/3/tAMT/1AMT/
s/NUMNUM/-/ s/NUM/([0-9]*/)NUM//1/
s//([0-9]/),//1/ }
最后一行除去数字后的逗号。它把如 "3,231.00" 这样的美元金额转换成我使用的格式 "3231.00"。现在,让我们看一下最终脚本:
1d /^^/d s/[[:cntrl:]]//g /^D/ { s/^D/(.*/)//1/tOUTY/tINNY/t/
s/^01/Jan/ s/^02/Feb/ s/^03/Mar/ s/^04/Apr/ s/^05/May/
s/^06/Jun/ s/^07/Jul/ s/^08/Aug/ s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/ s:^/(.*/)//(.*/)//(.*/):/2 /1 /3:
N N N s//nT/(.*/)/nN/(.*/)/nP/(.*/)/NUM/2NUM/t/tY/t/t/3/tAMT/1AMT/
s/NUMNUM/-/ s/NUM/([0-9]*/)NUM//1/ s//([0-9]/),//1/
/AMT-[0-9]*.[0-9]*AMT/b fixnegs
s/AMT/(.*/)AMT//1/ s/OUTY/-/ s/INNY/inco/
b done :fixnegs s/AMT-/(.*/)AMT//1/ s/OUTY/misc/
s/INNY/-/ :done }
如您所见,只要循序渐进地解决问题,使用 sed 转换数据就没有那么难。不要试图使用一个 sed 命令或一下子解决所有问题。相反,要朝着目标逐步进行,并不断改进 sed 脚本,直到其输出正如您希望那样为止。sed 有许多功能,希望您已非常熟悉其内部工作原理并继续努力以进一步掌握它!
- 阅读 developerWorks 上 Daniel 的其它 sed 文章:通用线程:sed 实例,第 1 部分和第 2 部分。
- 查看 Eric Pement 极佳的 sed faq。
- 可以在 ftp.gnu.org 找到 sed 3.02 资源。
- 将在 alpha.gnu.org 找到很好的新的 sed 3.02.80。
- 另外,Eric Pement 还有一些方便的 sed 单行程序,任何有抱负的 sed 高手都应该看一下。
- 如果想看好的老式书籍,O'Reilly 的 sed & awk, 2nd Edition 将是极佳选择。
- 可能想阅读 7th edition UNIX's sed man page(大概 1978!)。
- 阅读 Felix von Leitner 短小的 sed tutorial。
- 在 using regular expressions 中复习,发现和修改这个免费 dW 独家教程文本中的模式。
关于作者
Daniel Robbins 居住在新墨西哥州的 Albuquerque。他是 Gentoo Technologies, Inc. 的总裁兼 CEO,Gentoo Linux(用于 PC 的高级 Linux)和 Portage 系统(Linux 的下一代端口系统)的创始人。他还是 Macmillan 书籍 Caldera OpenLinux Unleashed、SuSE Linux Unleashed 和 Samba Unleashed 的作者。Daniel 自小学二年级起就与计算机结下不解之缘,那时他首先接触的是 Logo 程序语言,并沉溺于 Pac-Man 游戏中。这也许就是他至今仍担任 SONY Electronic Publishing/Psygnosis 的首席图形设计师的原因所在。Daniel 喜欢与妻子 Mary 和新出生的女儿 Hadassah 一起共度时光。可通过 drobbins@gentoo.org 与 Daniel Robbins 联系。
- sed实例
- sed 实例
- sed 实例
- sed实例
- sed实例
- sed实例
- Sed实例
- Sed实例
- sed命令实例
- sed实例解析
- sed 用法及实例
- sed精彩实例解析
- 通用线程 -- sed 实例
- sed用法和实例
- sed 用法及实例
- sed 用法及实例
- 通用线程 -- sed 实例
- sed实例收集
- Linux下的库****
- J2ME编程实例---之数字键的测试
- java正则表达式文档
- The next step
- 读取配置xml文件的方法
- sed 实例
- SQL Server如何得到用户的继承列表 选择自 liufuyahong 的 Blog
- 怎样管理solaris里热插拔设备&〔USB〕
- java去除字符串中的空格、回车、换行符、制表符
- 导入Excel和导出Excel:的简单方法与程序处理方法,使用Excel程序读写Excel ,实现Excel的多个 Sheets读写并导出
- JdbcTemplate学习笔记
- how to ssh logon remote host without password
- 如何搭建J2ME的开发环境之一二
- 关于理财