(转自http://www.dbonline.cn/source/oracle/20031224/UNIX_text%20command%20sed.html)
转比写快多啦唉
文本处理命令之sed
作者:forest
测试:
以 Redhat6.0 为测试环境 事实上在solaris下的sed命令要比linux强,但因为没有测试 环境,我这里只给在linux下经过测试的用法。
目录:
★ 命令行参数简介 ★ 首先假设我们有这样一个文本文件 sedtest.txt ★ 输出指定范围的行 p ★ 在每一行前面增加一个制表符(^I) ★ 在每一行后面增加--end ★ 显示指定模式匹配行的行号 [/pattern/]= ★ 在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\ ★ 删除匹配行 [/pattern/]d 或者 [address1][,address2]d ★ 替换匹配行 [/pattern/]c\ 或者 [address1][,address2]c\ ★ 在匹配行前面插入文本 [/pattern/]i\ 或者 [address]i\ ★ 替换匹配串(注意不再是匹配行) [addr1][,addr2]s/old/new/g ★ 限定范围后的模式匹配 ★ 指定替换每一行中匹配的第几次出现 ★ &代表最后匹配 ★ 利用sed修改PATH环境变量 ★ 测试并提高sed命令运行效率 ★ 指定输出文件 [address1][,address2]w outputfile ★ 指定输入文件 [address]r inputfile ★ 替换相应字符 [address1][,address2]y/old/new/ ★ !号的使用 ★ \c正则表达式c 的使用 ★ sed命令中正则表达式的复杂性 ★ 转换man手册成普通文本格式(新) ★ sed的man手册(用的就是上面的方法)
★ 命令行参数简介
sed -e script 指定sed编辑命令 -f scriptfile 指定的文件中是sed编辑命令 -n 寂静模式,抑制来自sed命令执行过程中的冗余输出信息,比如只 显示那些被改变的行。
不明白?不要紧,把这些肮脏丢到一边,跟我往下走,不过下面的介绍里 不包括正则表达式的解释,如果你不明白,可能有点麻烦。
★ 首先假设我们有这样一个文本文件 sedtest.txt
cat > sedtest.txt Sed is a stream editor ---------------------- A stream editor is used to perform basic text transformations on an input stream -------------------------------------------------------------------------------- While in some ways similar to an editor which permits scripted edits (such as ed ) , -------------------------------------------------------------------------------- - - sed works by making only one pass over the input(s), and is consequently more ----------------------------------------------------------------------------- efficient. But it is sed's ability to filter text in a pipeline which particular l y -------------------------------------------------------------------------------- -
★ 输出指定范围的行 p other types of editors.
sed -e "1,4p" -n sedtest.txt sed -e "/from/p" -n sedtest.txt sed -e "1,/from/p" -n sedtest.txt
★ 在每一行前面增加一个制表符(^I)
sed "s/^/^I/g" sedtest.txt
注意^I的输入方法是ctrl-v ctrl-i
单个^表示行首
★ 在每一行后面增加--end
sed "s/$/--end/g" sedtest.txt
单个$表示行尾
★ 显示指定模式匹配行的行号 [/pattern/]=
sed -e '/is/=' sedtest.txt
1 Sed is a stream editor ---------------------- 3 A stream editor is used to perform basic text transformations on an input stream -------------------------------------------------------------------------------- While in some ways similar to an editor which permits scripted edits (such as ed ) , -------------------------------------------------------------------------------- - - 7 sed works by making only one pass over the input(s), and is consequently more ----------------------------------------------------------------------------- 9 efficient. But it is sed's ability to filter text in a pipeline which particular l y -------------------------------------------------------------------------------- - - 意思是分析sedtest.txt,显示那些包含is串的匹配行的行号,注意11行中出现了is字符串 这个输出是面向stdout的,如果不做重定向处理,则不影响原来的sedtest.txt
★ 在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\ ^D
sed -f sedadd.script sedtest.txt
Sed is a stream editor
A stream editor is used to perform basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed ) , -------------------------------------------------------------------------------- - - sed works by making only one pass over the input(s), and is consequently more ----------------------------------------------------------------------------- efficient. But it is sed's ability to filter text in a pipeline which particular l y -------------------------------------------------------------------------------- - - [scz@ /home/scz/src]> sed -e "a\\ +++++++++ ---------------------------------------------
找到包含from字符串的行,在该行的下一行增加+++++++++。 这个输出是面向stdout的,如果不做重定向处理,则不影响原来的sedtest.txt
很多人想在命令行上直接完成这个操作而不是多一个sedadd.script,不幸的是,这需要用?nbsp; ?nbsp; 续行符\,
[scz@ /home/scz/src]> sed -e "/from/a\\ > +++++++++" sedtest.txt
[scz@ /home/scz/src]> sed -e "a\\ > +++++++++" sedtest.txt
上面这条命令将在所有行后增加一个新行+++++++++
[scz@ /home/scz/src]> sed -e "1 a\\ > +++++++++" sedtest.txt
把下面这两行copy/paste到一个shell命令行上,效果一样
+++++++++" sedtest.txt
[address]a\ 只接受一个地址指定
对于a命令,不支持单引号,只能用双引号,而对于d命令等其他命令,同时
★ 删除匹配行 [/pattern/]d 或者 [address1][,address2]d
sed -e '/---------------------------------------------/d' sedtest.txt
Sed is a stream editor
A stream editor is used to perform basic text transformations on an input stream While in some ways similar to an editor which permits scripted edits (such as ed ) , sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particular l
y
sed -e '6,10d' sedtest.txt 删除6-10行的内容,包括6和10
sed -e "2d" sedtest.txt 删除第2行的内容
sed "1,/^$/d" sedtest.txt 删除从第一行到第一个空行之间的所有内容 注意这个命令很容易带来意外的结果,当sedtest.txt中从第一行开始并没有空行,则sed删 ?nbsp; ?nbsp;
sed "1,/from/d" sedtest.txt 删除从第一行到第一个包含from字符串的行之间的所有内容,包括第一个包含 from字符串的行。
★ 替换匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
sed -e "/is/c\\ **********" sedtest.txt
寻找所有包含is字符串的匹配行,替换成**********
********** ---------------------- ********** -------------------------------------------------------------------------------- While in some ways similar to an editor which permits scripted edits (such as ed ) , -------------------------------------------------------------------------------- - - ********** ----------------------------------------------------------------------------- ********** -------------------------------------------------------------------------------- -
sed -e "1,11c\\ **********" sedtest.txt---------------------- 在1-12行内搜索所有from字符串,分别替换成****字符串
★ 限定范围后的模式匹配
sed "/But/s/is/are/g" sedtest.txt 对那些包含But字符串的行,把is替换成are
sed "/is/s/t/T/" sedtest.txt 对那些包含is字符串的行,把每行第一个出现的t替换成T
sed "/While/,/from/p" sedtest.txt -n 输出在这两个模式匹配行之间的所有内容
★ 指定替换每一行中匹配的第几次出现
sed "s/is/are/5" sedtest.txt 把每行的is字符串的第5次出现替换成are
★ &代表最后匹配
sed "s/^$/(&)/" sedtest.txt 给所有空行增加一对()
sed "s/is/(&)/g" sedtest.txt 给所有is字符串外增加()
sed "s/.*/(&)/" sedtest.txt 给所有行增加一对()
sed "/is/s/.*/(&)/" sedtest.txt 给所有包含is字符串的行增加一对()
★ 利用sed修改PATH环境变量
先查看PATH环境变量 [scz@ /home/scz/src]> echo $PATH /usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
去掉尾部的{ :/usr/X11R6/bin:. } [scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\):\/usr[/]X11R6\/bin:[.]$/\1/" /usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin
去掉中间的{ :/bin: } [scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\):\/bin:\(.*\)$/\1\2/" /usr/bin:/usr/bin/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
[/]表示/失去特殊意义 \/同样表示/失去意义 \1表示子匹配的第一次出现 \2表示子匹配的第二次出现 \(.*\)表示子匹配
去掉尾部的:,然后增加新的路径 PATH=`echo $PATH | sed 's/\(.*\):$/\1/'`:$HOME/src 注意反引号`和单引号'的区别。
★ 测试并提高sed命令运行效率
time sed -n "1,12p" webkeeper.db > /dev/null time sed 12q webkeeper.db > /dev/null 可以看出后者比前者效率高。
[address]q 当碰上指定行时退出sed执行
★ 指定输出文件 [address1][,address2]w outputfile
sed "1,10w sed.out" sedtest.txt -n 将sedtest.txt中1-10行的内容写到sed.out文件中。
★ 指定输入文件 [address]r inputfile
sed "1r sedappend.txt" sedtest.txt 将sedappend.txt中的内容附加到sedtest.txt文件的第一行之后
★ 替换相应字符 [address1][,address2]y/old/new/
sed "y/abcdef/ABCDEF/" sedtest.txt 将sedtest.txt中所有的abcdef小写字母替换成ABCDEF大写字母。
★ !号的使用
sed -e '3,7!d' sedtest.txt 删除3-7行之外的所有行
sed -e '1,/from/!d
|