sed总结

  • 2015-04-07
  • 121
  • 0
  • 0

1、介绍

1.1 概述

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

1.2 常用选项

选项
使用说明
-i
直接修改读取的文件内容,而不是输出到终端。
-e
直接在命令行模式上进行sed动作编辑,多点编辑。
-n
使用安静(silent)模式。只打印匹配的行,因为sed默认会打印所有行。
-f
从指定文件中读取编辑脚本。
-r
使用扩展正则表达式。

1.3 常用参数

命令
使用说明
p
打印匹配行(和-n选项一起合用)。
d
删除(delete)指定的行。
s
字符串替换(substitude)。
a
追加新的文本(append),在指定行后添加一行或多行文本。
c
取代指定的行。
=
打印行号。
i
在指定行前添加一行或多行文本。
g

1.4 删除命令

命令
使用说明
sed ‘nd’ ab
删除第n行。
sed ‘$d’ ab
删除最后一行。
sed ‘n,md’ ab
删除第n行到第m行。
sed ‘n,$d’ ab
删除第n行到最后一行。
sed ‘/word/d’ test.txt
删除所有包含’word’的行。
sed ‘/word/ +2 d’ test.txt
删除匹配’word’的行及它下面两行。
sed ‘/^$/d’ test.txt
删除所有空行。
sed ‘/^#/’ test.txt
删除所有注释行。
sed ‘1~2d’ test.txt
删除奇数行。
sed ‘1~2!d’ test.txt
删除偶数行。
sed ‘2~2d’ test.txt
删除偶数行。

1.5 显示命令

命令
使用说明
sed -n ‘np’ ab
显示第n行
sed -n ‘$p’ ab
显示最后一行
sed -n ‘n,mp’ ab
显示第n行到第m行
sed -n ‘n,$p’ ab
显示第n行到最后一行
sed -n ‘/word/p’ test.txt
查询包含关键字word所在行
sed -n ‘/'”$变量名”‘/p’ tese.txt
匹配包含关键字为变量名的值所在的行

1.6 增加命令

若不加-i选项,则不改变源文件内容。
命令
使用说明
sed ‘na word’ test.txt
第n行后增加一行为word的字符。
sed ‘n,ma word’ test.txt
第n到m行每行后均增加一行为word的字符。
sed ‘na hello\nworld!’ test.txt
第n行后增加两行字符,一行为hello,一行为world,通过换行符\n实现。
sed ‘ni word’ test,txt
在第n行前增加一行为word的字符。
sed ‘$a word’ test.txt
在最后一行后增加一行为word的字符。

1.7 替换命令

若不加-i选项,则不改变源文件内容。
命令
使用说明
sed ‘nc word’ test.txt
用word替换第n行文本。
sed ‘n,mc word’ test.txt
用word替换第n行到第m行文本。
sed ‘s/要替换的字符串/新的字符串/g’ test.txt
替换一行中的某部分,其中/可以用其他字符代替,如#,%,@,
其中g是替换所有匹配到的行的相关内容。

2、练习

练习文本一
sed.txt:
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Ephram Hardy:293-259-5395:235 CarltonLane, Joliet, IL 73858:8/12/20:56700
James Ikeda:834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Barbara Kertz:385-573-8326:832 Ponce Drive, Gary, IN 83756:12/1/46:268500
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Sir Lancelot:837-835-8257:474 Camelot Boulevard, Bath, WY 28356:5/13/69:24500
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350
Jose Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600
Tommy Savage:408-724-0140:1222 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Yukio Takeshida:387-827-1095:13 Uno Lane, Ashville, NC 23556:7/1/29:57000
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
1)把Jon的名字改成Jonathan,不改变源文件。
sed -n 's#Jon#Jonathan#gp' sed.txt
2)删除头三行,不改变源文件。
sed '1,3d' sed.txt
3)显示5-10行。
sed -n '5,10p' sed.txt
4)删除包含Lane的行,不改变源文件。
sed '/Lane/d' sed.txt
5)显示所有生日在November-December之间的行。
sed -n '/:1[1-2]\//p' sed.txt
6)把三个星号(***)添加到以Fred开头的行,不改变源文件。
sed -n 's#^Fred#***Fred#gp' sed.txt
7)用Jose has retired取代包含Jose开头的行,不改变源文件。
sed -n 's#^Jose.*#Jose has retired#gp' sed.txt
8)把Popeye的生日改成11/14/46。
sed -n '/Popeye/{p; s#[0-9][0-9]*/[0-9][0-9]*/[0-9][0-9]*#11/14/46#; p}' sed.txt
9)删除所有空行。
sed -i '/^$/d' sed.txt
10)在第一行之前插入标题PERSONNEL FILE,不改变源文件。
sed '1i PERSONNEL FILE' sed.txt
11)删除以500结尾的工资的行,不改变源文件。
sed '/500$/d' sed.txt
12)在文件末尾添加THE END,不改变源文件。
sed '$a THE END' sed.txt

评论

还没有任何评论,你来说两句吧