sed学习笔记(二)
时间:2009-07-15 来源:dolinux
6)r读文件。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置。
比如:
along@along-laptop:~/code/shell/sed$ cat file
---------Read File------------
along@along-laptop:~/code/shell/sed$ sed '/along/r file' datafile
along 04075021 1 90
---------Read File------------
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
7)w 写文件命令。
sed使用该命令将当前文件中的匹配行写入另外一个文件中。
sed -n ‘/along/w newfile’ datafile
将datafile中包含along的行全部写如newfile文件中。
8)a 追加命令。在当前行之后添加新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/along/a\----student----' datafile
along 04075021 1 90
----student----
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
9)i 插入命令。在当前行之前插入新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/along/i\----student----' datafile
----student----
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
10)c 修改命令。sed使用该命令将当前行修改成新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/ming/c\----student----' datafile
along 04075021 1 90
----student----
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
----student----
11)n 命令。sed使用该命令获取输入文件的下一行进行处理。
比如:
along@along-laptop:~/code/shell/sed$ cat datafile
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 '/along/{n;s/ming/long/;}' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
将包含along的文本的下一行中的ming改为long。
12)y 命令。转换。字符按照一对一的方式从左到有进行转换。
sed '1,3y/abc/ABC/' datafile
13)q 命令。退出。
sed ‘5q’ datafile
显示完第5行时退出。
14)暂存和取用:h和g命令。
h:将模式空间的内容复制到暂存缓冲区,即一个特殊的临时缓冲区。暂存缓冲区的当前内容被清除。
H: 将换行符和模式空间的内容追加到暂存缓冲区中,即使暂存缓冲区为空,这个命令也追加换行符。当暂存缓冲区为空时拷贝到暂存缓冲区的内容前边要加上空行,
当暂存缓冲区不为空时,H这个命令就又不再加空行了。
g:将暂存缓冲区中的内容复制到模式空间中,并将当前的内容清除。
G:将暂存缓冲区内容追加到模式空间。如果暂存缓冲区为空,则将换行符添加到模式空间。
along@along-laptop:~/code/shell/sed$ cat datafile
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
1》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{h;d;} ' -e '$g' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoguang 04075032 2 89
首先找到包含xiao的行,以覆盖的方式将其复制到暂存缓冲区,然后删除当前行,最后以覆盖的方式取出。
2》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;} ' -e '$g' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
找到包含xiao的行,以追加的方式将其复制到暂存缓冲区,然后删除当前行,最后以覆盖的方式取出加在文件末尾。
3》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;}' -e '${g;s/.//;}' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
比较3和2的不同。
4》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{h;d;}' -e '$G' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoguang 04075032 2 89
找到包含xiao的行,以覆盖的方式将其复制到暂存缓冲区,然后删除当前行,最后以追加的方式取出。
5》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;}' -e '$G' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
找到包含xiao的行,以追加的方式将其复制到暂存缓冲区,然后删除当前行,最后以追加的方式取出。
6》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d}' -e '$G' datafile|sed -e '/^$/d'
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
比较5和6的区别。6是清除了空行。
7》现在有文件file:
first line
second line
third line
sed -e '/third/{h;d;}' -e '/first/{G;}'
第1行,第一条命令不匹配,输出第一行;接下来执行第二条命令匹配,所以从暂存空间中取出内容,此时为空所以输出空行。
第二行,第一条不匹配,输出第二行,接下来第二条不匹配
第3行,第一条匹配所以直接执行第一条命令,不输出。接下来执行第二条命令。
故结果:
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/first/{G;}' file
first line
second line
sed -e '/third/{h;d;}' -e '/second/{G;}' file
第一行:第一条命令不匹配,输出第一行;接下来执行第二条命令,不匹配。
第二行:第一条命令不匹配,输出第二行;接下来执行第二条命令,匹配所以从暂存空间中取出内容,此时为空,所以输出空行。
第三行:第一条匹配,不输出,直接删除,并存入暂存空间;第二条不匹配。
故结果:(此时second下面有一个空行)
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/second/{G;}' file
first line
second line
sed -e '/third/{h;d;}' -e '/third/{G;}' file
第一行:第一条命令不匹配,输出第一行;接下来执行第二条命令,不匹配。
第二行:第一条命令不匹配,输出第二行;接下来执行第二条命令,不匹配。
第三行:第一条匹配,不输出,存入暂存空间,并直接从模式空间删除;第二条此时模式空间没有了内容所以也就无法匹配了。
故结果:
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/third/{G;}' file
first line
second line
15)删除空行
现在有文件datafile
along@along-laptop:~/code/shell/sed$ cat datafile
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
现在想要删除中间的两个空行和每行前边的空格。其中第一个空行是用回车符造成的。第二个使用空格造成的。
如果使用sed '/^$/d' datafile 那么只能删除第一个空行。要想删除两个空行同时删除空格就要这样写:
sed -e '/^[ ]*$/d' -e 's/^[ ]*//' datafile
16)我有文件gr:
90
ad
a9
#8
执行下面这个sed语句:
along@along-laptop:~/code/shell/sed$ sed -n '/^[^0-9a-z]*[0-9]\{1,\}/p' gr
90
#8
这里说明 90 和我的正则表达式 ^[^0-9a-z]*[0-9]\{1,\} 是匹配的。
^[^0-9a-z]*[0-9]\{1,\} 匹配的是:非数字和小写字母出现0次或多次,中间是任意字符,然后再加上1-n个数字组成的字符串。
而 90这个字符串行首是9 符合行首为 0个非数字和小写字母开头,因此就匹配了。
注意:*是匹配前面的0次或多次。
*是匹配前面的0次或多次。所以要匹配不以数字和小写字母开头,中间任意个字符再加一个或多个数字结尾用正则表达式/^[^0-9a-z].*[0-9]\{1,\}/就可以了。
17.sed直接将修改结果保存到源文件中,需要使用-i参数。
也就是:sed -i 's/along/good/' sedx
将修改结果保存到另外的文件中要用到重定向或者是w。
也就是:sed 's/good/along/ w newfile' oldfile (会在终端上打印修改后的内容)
或者:sed 's/good/along/' oldfile > newfile (不在终端上打印)
比如下面的例子:
1)直接修改原文件
along@along-laptop:~/code/shell$ cat sedx
good name is along~
along@along-laptop:~/code/shell$ sed -i 's/good/along/' sedx
along@along-laptop:~/code/shell$ cat sedx
along name is along~
2)将结果打印到另外一个文件中。
也就是:sed -i 's/along/good/' sedx
将修改结果保存到另外的文件中要用到重定向或者是w。
along@along-laptop:~/code/shell$ cat sedx
along name is along~
along@along-laptop:~/code/shell$ sed 's/along/good/ w out' sedx
good name is along~
along@along-laptop:~/code/shell$ cat out
good name is along~
along@along-laptop:~/code/shell$ sed 's/good/along/' sedx > out
along@along-laptop:~/code/shell$ cat out
along name is along~
总结:
h:将模式空间的内容复制到暂存缓冲区, 即一个特殊的临时缓冲区。暂存缓冲区的当前内容被清除。
H: 将换行符和模式空间的内容追加到暂存缓冲区中,即使暂存缓冲区为空,这个命令也追加换行符。当
暂 存缓冲区为空时拷到暂存缓冲区的内容前边要加上空行,当暂存缓冲区不为空时,H这个命令就
又不再加空行了。
g:将暂存缓冲区中的内容复制到模式空间中,并将当前的内容清除。
G:将暂存缓冲区内容追加到模式空间。如果暂存缓冲区为空,则将换行符添加到模式空间。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'h;G'
123
123 ;因为h清空了暂存缓冲区,而且h拷贝时不会加上回车所以这里没有空格。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'H;G'
123
123 ;H拷贝时暂存缓冲区为空时拷贝到暂存缓冲区的内容前边要加上空行,所以这里会出现一个空行。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'H;g'
123 ;这和上边的一样,H会加上一个回车,同时g会清空模式空间当前的内容
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'h;g'
123 ;h清空了暂存缓冲区,且拷贝时不加回车,g清空了模式空间,所以这里只有一行。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'H;H;g'
123
123 ;当暂存缓冲区不为空时H就不再加回车了。所以这里只有一个空行。
比如:
along@along-laptop:~/code/shell/sed$ cat file
---------Read File------------
along@along-laptop:~/code/shell/sed$ sed '/along/r file' datafile
along 04075021 1 90
---------Read File------------
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
7)w 写文件命令。
sed使用该命令将当前文件中的匹配行写入另外一个文件中。
sed -n ‘/along/w newfile’ datafile
将datafile中包含along的行全部写如newfile文件中。
8)a 追加命令。在当前行之后添加新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/along/a\----student----' datafile
along 04075021 1 90
----student----
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
9)i 插入命令。在当前行之前插入新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/along/i\----student----' datafile
----student----
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
10)c 修改命令。sed使用该命令将当前行修改成新文本。
比如:
along@along-laptop:~/code/shell/sed$ sed '/ming/c\----student----' datafile
along 04075021 1 90
----student----
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
----student----
11)n 命令。sed使用该命令获取输入文件的下一行进行处理。
比如:
along@along-laptop:~/code/shell/sed$ cat datafile
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 '/along/{n;s/ming/long/;}' datafile
along 04075021 1 90
xiaolong 04075022 1 92
xiaoguang 04075032 2 89
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
将包含along的文本的下一行中的ming改为long。
12)y 命令。转换。字符按照一对一的方式从左到有进行转换。
sed '1,3y/abc/ABC/' datafile
13)q 命令。退出。
sed ‘5q’ datafile
显示完第5行时退出。
14)暂存和取用:h和g命令。
h:将模式空间的内容复制到暂存缓冲区,即一个特殊的临时缓冲区。暂存缓冲区的当前内容被清除。
H: 将换行符和模式空间的内容追加到暂存缓冲区中,即使暂存缓冲区为空,这个命令也追加换行符。当暂存缓冲区为空时拷贝到暂存缓冲区的内容前边要加上空行,
当暂存缓冲区不为空时,H这个命令就又不再加空行了。
g:将暂存缓冲区中的内容复制到模式空间中,并将当前的内容清除。
G:将暂存缓冲区内容追加到模式空间。如果暂存缓冲区为空,则将换行符添加到模式空间。
along@along-laptop:~/code/shell/sed$ cat datafile
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
1》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{h;d;} ' -e '$g' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoguang 04075032 2 89
首先找到包含xiao的行,以覆盖的方式将其复制到暂存缓冲区,然后删除当前行,最后以覆盖的方式取出。
2》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;} ' -e '$g' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
找到包含xiao的行,以追加的方式将其复制到暂存缓冲区,然后删除当前行,最后以覆盖的方式取出加在文件末尾。
3》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;}' -e '${g;s/.//;}' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
比较3和2的不同。
4》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{h;d;}' -e '$G' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoguang 04075032 2 89
找到包含xiao的行,以覆盖的方式将其复制到暂存缓冲区,然后删除当前行,最后以追加的方式取出。
5》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d;}' -e '$G' datafile
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
找到包含xiao的行,以追加的方式将其复制到暂存缓冲区,然后删除当前行,最后以追加的方式取出。
6》along@along-laptop:~/code/shell/sed$ sed -e '/xiao/{H;d}' -e '$G' datafile|sed -e '/^$/d'
along 04075021 1 90
chang 04075036 2 79
hang 04075098 3 70
jinming 0408098 2 jinming 37
xiaoming 04075022 1 92
xiaoguang 04075032 2 89
比较5和6的区别。6是清除了空行。
7》现在有文件file:
first line
second line
third line
sed -e '/third/{h;d;}' -e '/first/{G;}'
第1行,第一条命令不匹配,输出第一行;接下来执行第二条命令匹配,所以从暂存空间中取出内容,此时为空所以输出空行。
第二行,第一条不匹配,输出第二行,接下来第二条不匹配
第3行,第一条匹配所以直接执行第一条命令,不输出。接下来执行第二条命令。
故结果:
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/first/{G;}' file
first line
second line
sed -e '/third/{h;d;}' -e '/second/{G;}' file
第一行:第一条命令不匹配,输出第一行;接下来执行第二条命令,不匹配。
第二行:第一条命令不匹配,输出第二行;接下来执行第二条命令,匹配所以从暂存空间中取出内容,此时为空,所以输出空行。
第三行:第一条匹配,不输出,直接删除,并存入暂存空间;第二条不匹配。
故结果:(此时second下面有一个空行)
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/second/{G;}' file
first line
second line
sed -e '/third/{h;d;}' -e '/third/{G;}' file
第一行:第一条命令不匹配,输出第一行;接下来执行第二条命令,不匹配。
第二行:第一条命令不匹配,输出第二行;接下来执行第二条命令,不匹配。
第三行:第一条匹配,不输出,存入暂存空间,并直接从模式空间删除;第二条此时模式空间没有了内容所以也就无法匹配了。
故结果:
along@along-laptop:~/code/shell/sed$ sed -e '/third/{h;d;}' -e '/third/{G;}' file
first line
second line
15)删除空行
现在有文件datafile
along@along-laptop:~/code/shell/sed$ cat datafile
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
现在想要删除中间的两个空行和每行前边的空格。其中第一个空行是用回车符造成的。第二个使用空格造成的。
如果使用sed '/^$/d' datafile 那么只能删除第一个空行。要想删除两个空行同时删除空格就要这样写:
sed -e '/^[ ]*$/d' -e 's/^[ ]*//' datafile
16)我有文件gr:
90
ad
a9
#8
执行下面这个sed语句:
along@along-laptop:~/code/shell/sed$ sed -n '/^[^0-9a-z]*[0-9]\{1,\}/p' gr
90
#8
这里说明 90 和我的正则表达式 ^[^0-9a-z]*[0-9]\{1,\} 是匹配的。
^[^0-9a-z]*[0-9]\{1,\} 匹配的是:非数字和小写字母出现0次或多次,中间是任意字符,然后再加上1-n个数字组成的字符串。
而 90这个字符串行首是9 符合行首为 0个非数字和小写字母开头,因此就匹配了。
注意:*是匹配前面的0次或多次。
*是匹配前面的0次或多次。所以要匹配不以数字和小写字母开头,中间任意个字符再加一个或多个数字结尾用正则表达式/^[^0-9a-z].*[0-9]\{1,\}/就可以了。
17.sed直接将修改结果保存到源文件中,需要使用-i参数。
也就是:sed -i 's/along/good/' sedx
将修改结果保存到另外的文件中要用到重定向或者是w。
也就是:sed 's/good/along/ w newfile' oldfile (会在终端上打印修改后的内容)
或者:sed 's/good/along/' oldfile > newfile (不在终端上打印)
比如下面的例子:
1)直接修改原文件
along@along-laptop:~/code/shell$ cat sedx
good name is along~
along@along-laptop:~/code/shell$ sed -i 's/good/along/' sedx
along@along-laptop:~/code/shell$ cat sedx
along name is along~
2)将结果打印到另外一个文件中。
也就是:sed -i 's/along/good/' sedx
将修改结果保存到另外的文件中要用到重定向或者是w。
along@along-laptop:~/code/shell$ cat sedx
along name is along~
along@along-laptop:~/code/shell$ sed 's/along/good/ w out' sedx
good name is along~
along@along-laptop:~/code/shell$ cat out
good name is along~
along@along-laptop:~/code/shell$ sed 's/good/along/' sedx > out
along@along-laptop:~/code/shell$ cat out
along name is along~
总结:
h:将模式空间的内容复制到暂存缓冲区, 即一个特殊的临时缓冲区。暂存缓冲区的当前内容被清除。
H: 将换行符和模式空间的内容追加到暂存缓冲区中,即使暂存缓冲区为空,这个命令也追加换行符。当
暂 存缓冲区为空时拷到暂存缓冲区的内容前边要加上空行,当暂存缓冲区不为空时,H这个命令就
又不再加空行了。
g:将暂存缓冲区中的内容复制到模式空间中,并将当前的内容清除。
G:将暂存缓冲区内容追加到模式空间。如果暂存缓冲区为空,则将换行符添加到模式空间。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'h;G'
123
123 ;因为h清空了暂存缓冲区,而且h拷贝时不会加上回车所以这里没有空格。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'H;G'
123
123 ;H拷贝时暂存缓冲区为空时拷贝到暂存缓冲区的内容前边要加上空行,所以这里会出现一个空行。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'H;g'
123 ;这和上边的一样,H会加上一个回车,同时g会清空模式空间当前的内容
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'h;g'
123 ;h清空了暂存缓冲区,且拷贝时不加回车,g清空了模式空间,所以这里只有一行。
along@along-laptop:~/code/shell/sed$ echo "123" | sed 'H;H;g'
123
123 ;当暂存缓冲区不为空时H就不再加回车了。所以这里只有一个空行。
相关阅读 更多 +