sed 练习

原出处: http://hi.baidu.com/pmghong/item/f0aae72a214d057fc28d596c

http://hi.baidu.com/pmghong/item/9ea6da28be3fa3e6a4275a69

 这两天在培训RHCE的课程里面讲的是sed和awk,初次接触这俩东西,用起来还真是要命,那些符号一多,看起来就晕了,赶紧整理下笔记先。

 
sed01.txt 内容如下: 
 
 

=========================================================

 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin      sync:x:5:0:sync:/sbin:/bin/sync  shutdown:x:6:0:shut down:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin    operator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologin  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin  fTP:x:14:50:FTP User:/var/ftp:/sbin/nologin  nobody:x:99:99:NOBody:/:/sbin/nologin

 
 
 
 

===========================================================

 
 
 
 
 

对sed01.txt 作如下操作。 

1、删除文件每行的第一个非空字符。 

[student@teacher doc]$ cat sed01.txt |sed 's/[^[:space:]]//' 

 

2、删除文件每行的第二个非空字符。 

[student@teacher doc]$ cat sed01.txt |sed 's/\([^[:space:]]\)\([^[:space:]]\)/\1/' 

 

3、删除文件每行的最后一个字符。 

[root@client tmp]# sed 's/[a-z]$//' sed01.txt root:x:0:0:root:/root:/bin/bas 

 

4、删除文件每行的倒数第二个字符。 

[root@client tmp]# sed 's/\([a-z]\)\([a-z]$\)/\2/' sed01.txt root:x:0:0:root:/root:/bin/bah 

 

5、删除文件每行的第二个单词。 

[student@teacher doc]$ cat sed01.txt |sed 's/\([a-zA-Z]\{1,\}\)\([^a-zA-Z]\{1,\}\)\([a-zA-Z]\{1,\}\)/\1\2/' 

 

6、删除文件每行的倒数第二个单词。 

[root@client tmp]# sed 's/\(.*:\/\)\([a-z]\{1,\}\)\(\/[a-z]\{1,\}\)/\1\3/' sed01.txt root:x:0:0:root:/root://bash bin:x:1:1:bin:/bin://nologin 

 

7、删除文件每行的最后一个单词。 

[root@client tmp]# sed 's/[a-z]\{1,\}$//' sed01.txt root:x:0:0:root:/root:/bin/ bin:x:1:1:bin:/bin:/sbin/ 

 

8、交换每行的第一个字符和第二个字符。 [root@client tmp]# sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\2\1/' sed01.txt orot:x:0:0:root:/root:/bin/bash ibn:x:1:1:bin:/bin:/sbin/nologin 

 

9、交换每行的第一个字符和第二个单词。 [root@client tmp]# sed 's/\([a-zA-Z]\)\([a-zA-Z]\{1,\}:x:[^a-zA-Z]\{1,\}\)\([a-zA-Z]\{1,\}\)/\3\2\1/' sed01.txt rootoot:x:0:0:r:/root:/bin/bash binin:x:1:1:b:/bin:/sbin/nologin 

 

10、交换每行的第一个单词和最后一个单词。 

cat sed01.txt |sed 's/\([a-zA-Z]\{1,\}\)\([^a-zA-Z]\{1,\}.*[^a-zA-Z]\{1,\}\)\([a-zA-Z]\{1,\}$\)/\3\2\1/' 

 

11、删除一个文件中所有的数字。 

cat sed01.txt |sed 's/[0-9]//g' 

 

12、删除每行开头的所有空格。 

cat sed01.txt |sed 's/^[ ]\{1,\}//' 

 

13、用制表符替换文件中出现的所有空格。 

[student@teacher doc]$ cat sed01.txt |sed 's/[ ]/\t/g' 

 

14、把所有大写字母用括号()括起来。 

[root@client tmp]# sed 's/[A-Z]/(&)/g' sed01.txt f(T)(P):x:14:50:(F)(T)(P) (U)ser:/var/ftp:/sbin/nologin nobody:x:99:99:(N)(O)(B)ody:/:/sbin/nologin 

 

15、打印每行3次。 

[student@teacher doc]$ cat sed01.txt |sed 'p;p' [student@teacher doc]$ cat sed01.txt |sed 's/.*/&\n&\n&/'

 
 

16、只显示每行的第一个单词。

[root@client tmp]# sed 's/\([a-zA-Z]\{1,\}\)\(..*\)/\1/' sed01.txt

root bin daemon

 
 

17,将格式为 mm/yy/dd 的日期格式换成 mm;yy;dd 

[student@teacher doc]$ date +%m/%Y/%d |sed 's/\//;/g' date +%m/%Y/%d |sed 's#/#;#g' 


材料:
=============================================================
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 92743: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, Duluth, MN 23850:4/12/23:780900


Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, 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
======================================================================


对sed02.txt作如下操作:
用 sed 实现
1. Change the name Jon to Jonathan.
[root@client tmp]# sed -n 's/Jon/Jonathan/p' sed02.txt
Jonathan DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100

2. Delete the first three lines.
[root@client tmp]# cat -n sed02.txt|sed '1,3d'
     4  Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
     5  Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900

3. Print lines 5 through 10.
[root@client tmp]# cat sed01.txt |sed -n '5,10p'
        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
         shutdown:x:6:0:shut down:/sbin:/sbin/shutdown
        halt:x:7:0:halt:/sbin:/sbin/halt
         mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

4. Delete lines containing Lane.
[root@client tmp]# sed 's/Lane//' sed02.txt

5. Print all lines where the birthdays are in November or December.
[root@client tmp]# sed -n '/:1[12]\//p' sed02.txt
Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
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
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

6. Append three asterisks to the end of lines starting with Fred.
[root@student04 tmp]# sed -n 's/^Fred.*/& ***/p' sed02.txt 
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***
Fred Fardbarkle:674-843-1385:20 Parak Lane, Duluth, MN 23850:4/12/23:780900 ***

7. Replace the line containing Jose with JOSE HAS RETIRED.
[root@client tmp]# sed -n 's/Jose/JOSE HAS RETIRED/p' sed02.txt
Jon DeLoach:408-253-3122:123 Park St., San JOSE HAS RETIRED, CA 04086:7/25/53:85100
JOSE HAS RETIRED Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600

8. Change Popeye's birthday to 11/14/46. Assume you don't know Popeye's original birthday. Use a regular expression to search for it.
[root@student04 tmp]# sed -n '/Popeye/s#[0-9]\{1,2\}/[0-9]\{1,2\}/[0-9]\{2\}#11/14/46#p' sed02.txt 
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:11/14/46:22350

9. Delete all blank lines.
[root@client tmp]# sed '/^$/d' sed02.txt

10. Write a sed script that will
a. Insert above the first line the title PERSONNEL FILE.
[root@client tmp]# sed '1i PERSONNEL FILE' sed02.txt
PERSONNEL FILE
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

b. Remove the salaries ending in 500.
[root@client tmp]# sed '/500$/d' sed02.txt

c. Print the contents of the file with the last names and first names reversed.
[root@client tmp]# sed 's/\([a-zA-Z]\{1,\}\)\([^a-zA-Z]\)\([a-zA-Z]\{1,\}\)/\3\2\1/' sed02.txt
Blenheim Steve:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Boop Betty:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500

d. Append at the end of the file THE END.
[root@client tmp]# sed '$a THE END' sed02.txt
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
THE END

11. 打印出生日月份是9月和11月的
[root@student04 tmp]# sed -n -r '/:(9|11)\//p' sed02.txt 
teve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
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
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
teve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300
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
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值