sed 是一种新型的,非交互式的编辑器。
sed -V or sed --version 可以查看sed版本
sed 的工作过程
sed编辑器逐行处理文件或输入,并将输出结果发到屏幕。
sed把当前正在处理的行保存在一个临时缓冲区中(模式空间或临时缓冲),sed处理完毕模式空间中的行后,就把该行发送到屏幕上。sed每处理完一行就将其从模式空间中删除,然后将下一行读入空间,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改或破坏源文件。
如图:
sed 在文件中查找模式也要使用正则表达式RE和各种元字符。正则表达式是括在斜杠之间的模式,用于查找和替换。
sed -n '/RE/p' filename 格式
sed -n '/love/p' datafile
sed -n 's/RE/replacement string/'filename 格式
sed -n 's/love/like/' datafile
sed 命令选项列表
a\ 在当前行后添加一行或多行
c\ 用新文本修改(替换)当前行中的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间里的内容复制到暂存缓冲区
H 把模式空间的内容追加到暂存缓冲区
g 取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有的内容
G 取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容的后面
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
替换标志
g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区与模式缓冲区空间的内容
y 将字符转换为另一字符
-e 允许多项编辑
-f 指定sed脚本文件名
-n 取消默认的输出
sed支持的元字符跟grep 一样,只是多了 下面一个
& 保存查找窜以便在替换窜中引用 s/love/**&**/ &代表查找窜。字符串love将替换前后各加了两 个星号的引用,即:love变成**love**
sed 范例
P命令:用于显示模式缓冲区的内容
1.sed '/north/p' datafile
注意:默认情况下sed把所有输入行都打印在标准输出上。如果在某一行匹配到模式north,sed 将把该行再打印一遍。
上面的命令,sed 将打印datafile中所有的行,如果查找到匹配模式north,则再打印一遍该行。
-n 选项,用于取消默认的打印操作。
sed -n '/north/p' datafile
将只打印匹配模式north 的行
d命令: 删除
2.sed '3d' datafile
删除第三行,其余的行都被打印到屏幕上。
sed '/west/!d' datafile
删除不包含west的行
sed 's/....//' datafile
删除每行的前4个字符
sed 's/...$//' datafile
删除每行的后3个字符
sed '3,$d' datafile
删除从第三行到最后一行,剩余各行被打印到屏幕上
sed '/north/d' datafile
删除所有包含模式north 的行,其余各行被打印
s命令:替换
3.sed 's/west/north/g' datafile
将每行中出现的模式west,替换成 north;如果没有g 命令,则只将每行的第一个west 替换
sed -n 's/^west/north/g' datafile
只打印发生替换的那些行,即:只有在行首找到west 并将其替换成north 时,才打印此行
sed ‘s/[0-9][0-9]$/&.5’datafile
& 代表查找窜中匹配到的内容。 所有以两位数字结尾的行后面都被加上.5
sed -n 's/Hemenway/Jones/gp' datafile
只打印Hemenway被替换成Jones的 行
sed -n 's/\(Mar\)got/\1ianne/p' datafile
包含在圆括号里的模式Mar 作为标签1保存在特定的寄存器中。替换窜可以通过\1 引用它,则Margot被替换为Marianne。
sed 's#2#88#g' datafile
紧跟在s后面的#就是查找窜和替换窜之间的分隔符。分隔符默认为/,但可以改变。
逗号:指定行的范围
sed -n‘/west/,/east/p’ datafile
打印在模式west和east 之间的所有行。
如果west出现在ease之后的某一行,则打印的范围从west所在行开始,到下一个出现east的行或文件末尾(如果谴责未出现)
sed -n '5,/^northeast/p' datafile
打印从第5行到第一个以northeast开头的行之间的所有行
sed '/west/,/east/s/$/**VACA**/' datafile
修改从模式east到west之间的所有行,将各行的行尾($)替换成字符串**VACA**。
-e选项 :多重编辑
sed -e '1,3d' -e 's/Hemenway/Jones/' datafile
第一重编辑:删除第1-3行
第二重编辑:将Hemenway替换成Jones
因为是逐行进行这两项编辑,(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。
-r选项:读文件,读取文件指定的行。
cat newfile
abcdefghijklmnopqrstuvwxyz
newfile内容如上
sed '/susan/r newfile' datafile
如果在文件datafile中的某行匹配到模式susan,就在该行后读入文件newfile的内容。如果出现的不止一行,则出现的各行后都读入newfile内容。
-w选项:写文件,把指定行写入新文件中
sed -n '/north/w newfile' datafile
所有包含模式north的行都被写入到文件newfile中。
a\ 命令:追加
追加新文本到文件中当前行的后面。如果要追加的内容超过行,则每一行都必须以反斜杠结束。最后一行除外、最后一行将以引号和文件名结束、用于追加的文本必须出现在追加命令的下一行上。
sed '/^north /a\\
this is the position' datafile
所有以north开头,后跟一个空格的行后面追加"this is the position"。
注意: a后的第二个反斜杠用来转义表示换行
i\ 命令:插入
在当前行的行前插入新文本。
sed '/east/i\\
NEW ENGLAND REGION\\
------------------------' datafile
超过一行的,每行后面都必须以反斜杠结尾!
c\命令:修改
sed 使用该命令将已有的文本修改成新的 文本,旧文本被覆盖;
sed '/eastern/c\\
the old region has been temporarily closed' datafile
该命令将完整地修改在模式缓冲区中的当前行。
n 命令: 或许下一行
sed使用该命令或许输入文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。
sed '/eastern/{ n;s/AM/Archie/; }' datafile
如果某行匹配到模式eastern,n命令就指示sed 用下一个输入行(即包含AM的那行)替换模式空间中的当前行,并用Archie替换该行中的AM,然后打印该行,在继续往下处理、
y命令:转换
字符按照一对一的方式从左到右进行转换。
sed '1,3y/abcde/ABCDE/' datafile
把datafile中第1-3行中的小写字母abcde转换成大写字母ABCDE
q命令: 退出
sed '5q' datafile
打印完第5行后,q命令让sed退出。
暂存和互换: h命令和x命令
x 表示互换
sed 使用该命令互换暂存缓冲区中的模式与模式缓冲区中的当前行。
sed -e '/north/h' -e '/west/x' datafile
sed 查找datafile中匹配模式north的行后,将其存放在暂存缓冲区,然后,当它找到匹配模式west的行后,就将模式空间中的内容与暂存缓冲区中的互换。 简而言之:包含west的行将被包含north的行替换。
暂存和取用:h命令和g命令
阅读(812) | 评论(0) | 转发(2) |