sed命令简介及在sed命令中使⽤变量的⽅法
1. Sed简介
sed 是⼀种在线编辑器,它⼀次处理⼀⾏内容。处理时,把当前处理的⾏存储在临时缓冲区中,称为“模式空间”(pattern space),接着⽤sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下⼀⾏,这样不断重复,直到⽂件末尾。⽂件内容并没有改变,除⾮你使⽤重定向存储输出。Sed主要⽤来⾃动编辑⼀个或多个⽂件;简化对⽂件的反复操作;编写转换程序等。以下介绍的是Gnu 版本的Sed 3.02。
2. 定址
可以通过定址来定位你所希望编辑的⾏,该地址⽤数字构成,⽤逗号分隔的两个⾏数表⽰以这两⾏为起⽌的⾏的范围(包括⾏数表⽰的那两⾏)。如1,3表⽰1,2,3⾏,美元符号($)表⽰最后⼀⾏。范围可以通过数据,正则表达式或者⼆者结合的⽅式确定。
3. Sed命令
调⽤sed命令有两种形式:
*
sed [options] 'command' file(s)
*
sed [options] -f scriptfile file(s)
a\(反斜杠)
在当前⾏后⾯加⼊⼀⾏⽂本。
i\
在当前⾏上⾯插⼊⽂本。c\⽤新的⽂本改变本⾏的⽂本。
b lable
分⽀到脚本中带有标记的地⽅,如果分⽀不存在则分⽀到脚本的末尾。
d
从模板块(Pattern space)位置删除⾏。
D
删除模板块的第⼀⾏。
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表⽰把⼀个字符翻译为另外的字符(但是不⽤于正则表达式)
4. 选项
-e command, --expression=command
允许多台编辑。
-h, --help
打印帮助,并显⽰bug列表的地址。
-n, --quiet, --silent
取消默认输出。
-f, --filer=script-file
引导sed脚本⽂件名。
-
V, --version
打印版本和版权信息。
5. 元字符集
^
锚定⾏的开始如:/^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的⾏。
6. 实例
删除: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 an example' filename -----this is an example被追加到以filename⽂件⾥test开头的⾏后⾯,sed要求命令a后⾯有⼀个反斜杠。
插⼊:i命令
$ sed '/test/i\new line' filename
如果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的⾏互换。
7. 脚本
Sed脚本是⼀个sed的命令清单,启动Sed时以-f选项引导脚本⽂件名。Sed对于脚本中输⼊的命令⾮常挑剔,在命令的末尾不能有任何空⽩或⽂本,如果在⼀⾏中有多个命令,要⽤分号分隔。以#开头的⾏为注释⾏,且不能跨⾏。
⼆、sed命令中使⽤外部变量的⽅法:
1.sed命令使⽤双引号的情况下,使⽤$var直接引⽤$ echo|sed "s/^/$vb_/g"
# 上⾯例⼦引⽤了⼀个环境变量$RANDOM的值2.sed命令使⽤单引号的情况下,使⽤'"$var"'引⽤类似,我们可以看到
$ echo|sed 's/^/'"$RANDOM"'.rmvb_/g'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论