sed学习笔记(一)
时间:2009-07-15 来源:dolinux
1.Sed是一个非交互性文本流编辑器。sed与awk类似,执行时可以使用命令行;可以将
sed命令写入一个文件,然后调用sed;也可以将sed命令插入一个脚本文件并使脚本文件可执行。
一般情况下sed并不与初始化文件打交道,他操作的只是一个拷贝,如果要修改原文件那么就要用-i选项。
2.sed的工作过程:sed逐行处理输入文件,首先从输入文件读入一行到模式空间
也就是临时缓冲区,在该行上执行所有命令,将结果发送到指定的区域(stdout或指定的文件中)。当我们执行的是
一个sed脚本文件,那么我们就从输入文件中读入一行数据到模式空间,执行脚本文件中的所有命令,然后在继续读取输入
文件的下一行,并开始用sed脚本文件中的命令去处理文本。
3.sed定位文本的方法有两种:一种是行号,一种是正则表达式。
4.命令与选项:sed命令告诉sed如何处理由地址指定的各输入行。如果没有指定地址,sed就会处理所有的输入行。
sed的命令包括:
a\ :在当前行之后添加。追加。
c\ :用新文本替换当前行的文本。
d :删除当前行
i\ :在当前行之前插入文本
p :打印行
g :在行内进行全局替换
w :将行写入文件
s :用一个字符串替换另一个
命令还有很多,这里只列出了比较常用的几个。
sed的选项:
-e :允许多项编辑
-f :指定sed脚本文件名
-n :取消默认的输出
4.当没有出现语法错误时sed返回0。出现语法错误时返回非零。
5.
采用下面这个datafiel文件作为示例
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinming 37
1)p命令
along@along-laptop:~/code/shell/sed$ sed '/along/p' datafile
along 04075021 1 90
along 04075021 1 90
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
这是将所有找到的匹配行都打印两遍
along@along-laptop:~/code/shell/sed$ sed -n '/xiao/p' datafile
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
当加上了-n选项时,只打印匹配行。
-n要和 p 配合使用
2)d命令(删除)从模式空间中删除并读入下一行。
sed ‘3d’ datafile:删除第三行
along@along-laptop:~/code/shell/sed$ sed '3d' datafile
along 04075021 1 90
xiaoming 04075022 1 92
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
sed ‘3,$d’ datafile(删除第三行到最后一行)
sed '/along/d' datafile(包含模式along的行都被删除,其余行打印)
sed -n '/along/d' datafile(删除包含模式along的行,此时显示内容为空)
3)s命令(替换)
along@along-laptop:~/code/shell/sed$ sed 's/ming/long/g' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinlong 37
用long替换所有的ming。如果没有g那么将只替换每一行第一个ming。比如(注意观察最后一行):
along@along-laptop:~/code/shell/sed$ sed 's/ming/long/' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinming 37
sed 's/[9]/&.5/g' datafile (在所有的9后边都加上一个.5)
比如:
along@along-laptop:~/code/shell/sed$ sed 's/9/&.5/g' datafile
along 04075021 1 9.50
xiaoming 04075022 1 9.52
xiaoguang 04075032 2 89.5
chang 04075036 2 79.5
hang 0407509.58 3 70
jinming 040809.58 2 jinming 37
当符号“&”和s一起用的时候,表示在找到的匹配串后边加上相应的串。
紧跟在s命令后边的字符就是查找串和替换串之间的分隔符。分隔符默认是正斜杠,但是可以改变。无论什么字符
只要紧跟这s就成了新的分隔符。
比如:
along@along-laptop:~/code/shell/sed$ sed -n 's#ming#along#gp' datafile
xiaoalong 04075022 1 92
jinalong 0408098 2 jinalong 37
4)定址
along@along-laptop:~/code/shell/sed$ sed -n '1,/ming/p' datafile
along 04075021 1 90
xiaoming 04075022 1 92
从第一行开始打印直到第一次出现ming
along@along-laptop:~/code/shell/sed$ sed -n '2,2p' datafile
xiaoming 04075022 1 92
只打印第二行的内容。
5)-e多重编辑选项。用于sed执行多个编辑命令时将前一个的编辑结果应用到后一个编辑命令上。
along@along-laptop:~/code/shell/sed$ sed -n -e 's/ming/long/' -e 's/long/mn/gp' datafile
amn 04075021 1 90
xiaomn 04075022 1 92
jinmn 0408098 2 jinming 37
这个例子没有任何作用,只是为了说明问题。
首先第一行原来是along,当执行第一条编辑命令时发现无法匹配,于是继续执行第二条编辑命令将long替换为mn。
第二行就不用再说了。
第三行,首先执行第一条编辑命令,发现没有 g 命令,于是就只是将第一个ming替换为long;然后执行第二条编辑命令
此时虽然有 g 这个命令,但是已经于事无补,因为当前行此时只有一个long。所以结果也就理所当然是这样了jinmn 0408098 2 jinming 37。
sed命令写入一个文件,然后调用sed;也可以将sed命令插入一个脚本文件并使脚本文件可执行。
一般情况下sed并不与初始化文件打交道,他操作的只是一个拷贝,如果要修改原文件那么就要用-i选项。
2.sed的工作过程:sed逐行处理输入文件,首先从输入文件读入一行到模式空间
也就是临时缓冲区,在该行上执行所有命令,将结果发送到指定的区域(stdout或指定的文件中)。当我们执行的是
一个sed脚本文件,那么我们就从输入文件中读入一行数据到模式空间,执行脚本文件中的所有命令,然后在继续读取输入
文件的下一行,并开始用sed脚本文件中的命令去处理文本。
3.sed定位文本的方法有两种:一种是行号,一种是正则表达式。
4.命令与选项:sed命令告诉sed如何处理由地址指定的各输入行。如果没有指定地址,sed就会处理所有的输入行。
sed的命令包括:
a\ :在当前行之后添加。追加。
c\ :用新文本替换当前行的文本。
d :删除当前行
i\ :在当前行之前插入文本
p :打印行
g :在行内进行全局替换
w :将行写入文件
s :用一个字符串替换另一个
命令还有很多,这里只列出了比较常用的几个。
sed的选项:
-e :允许多项编辑
-f :指定sed脚本文件名
-n :取消默认的输出
4.当没有出现语法错误时sed返回0。出现语法错误时返回非零。
5.
采用下面这个datafiel文件作为示例
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinming 37
1)p命令
along@along-laptop:~/code/shell/sed$ sed '/along/p' datafile
along 04075021 1 90
along 04075021 1 90
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
这是将所有找到的匹配行都打印两遍
along@along-laptop:~/code/shell/sed$ sed -n '/xiao/p' datafile
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
当加上了-n选项时,只打印匹配行。
-n要和 p 配合使用
2)d命令(删除)从模式空间中删除并读入下一行。
sed ‘3d’ datafile:删除第三行
along@along-laptop:~/code/shell/sed$ sed '3d' datafile
along 04075021 1 90
xiaoming 04075022 1 92
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
sed ‘3,$d’ datafile(删除第三行到最后一行)
sed '/along/d' datafile(包含模式along的行都被删除,其余行打印)
sed -n '/along/d' datafile(删除包含模式along的行,此时显示内容为空)
3)s命令(替换)
along@along-laptop:~/code/shell/sed$ sed 's/ming/long/g' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinlong 37
用long替换所有的ming。如果没有g那么将只替换每一行第一个ming。比如(注意观察最后一行):
along@along-laptop:~/code/shell/sed$ sed 's/ming/long/' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinlong 0408098 2 jinming 37
sed 's/[9]/&.5/g' datafile (在所有的9后边都加上一个.5)
比如:
along@along-laptop:~/code/shell/sed$ sed 's/9/&.5/g' datafile
along 04075021 1 9.50
xiaoming 04075022 1 9.52
xiaoguang 04075032 2 89.5
chang 04075036 2 79.5
hang 0407509.58 3 70
jinming 040809.58 2 jinming 37
当符号“&”和s一起用的时候,表示在找到的匹配串后边加上相应的串。
紧跟在s命令后边的字符就是查找串和替换串之间的分隔符。分隔符默认是正斜杠,但是可以改变。无论什么字符
只要紧跟这s就成了新的分隔符。
比如:
along@along-laptop:~/code/shell/sed$ sed -n 's#ming#along#gp' datafile
xiaoalong 04075022 1 92
jinalong 0408098 2 jinalong 37
4)定址
along@along-laptop:~/code/shell/sed$ sed -n '1,/ming/p' datafile
along 04075021 1 90
xiaoming 04075022 1 92
从第一行开始打印直到第一次出现ming
along@along-laptop:~/code/shell/sed$ sed -n '2,2p' datafile
xiaoming 04075022 1 92
只打印第二行的内容。
5)-e多重编辑选项。用于sed执行多个编辑命令时将前一个的编辑结果应用到后一个编辑命令上。
along@along-laptop:~/code/shell/sed$ sed -n -e 's/ming/long/' -e 's/long/mn/gp' datafile
amn 04075021 1 90
xiaomn 04075022 1 92
jinmn 0408098 2 jinming 37
这个例子没有任何作用,只是为了说明问题。
首先第一行原来是along,当执行第一条编辑命令时发现无法匹配,于是继续执行第二条编辑命令将long替换为mn。
第二行就不用再说了。
第三行,首先执行第一条编辑命令,发现没有 g 命令,于是就只是将第一个ming替换为long;然后执行第二条编辑命令
此时虽然有 g 这个命令,但是已经于事无补,因为当前行此时只有一个long。所以结果也就理所当然是这样了jinmn 0408098 2 jinming 37。
相关阅读 更多 +