1. 笔记内容:
  2. *抽取域 
  3. *匹配正则表达式 
  4. *比较域 
  5. *增加、附加、替换 
  6. sed [选项] sed命令 输入文件 (命令要加单引号) 
  7. sed [选项] -f sed脚本文件 输入文件    (脚本解释器) 
  8.  
  9. ***【参数】*** 
  10. a、文本定位参数 
  11. x 行号    x,y 行号范围     
  12. /pattern/ 查询包含pattern的行 /pattern/part/ 查询包含两个关键字的行 
  13. pattern/,x 在给定行号上查询pattern 
  14. x,/pattern 通过行号和关键字查询匹配行 
  15. x,y! 查询不包含行号为x和y的行 
  16.  
  17. b、sed编辑命令 
  18. p 打印匹配行 = 显示文件行号     
  19. a\ 在定位行号后附加信文本信息    i\ 在定位行号后插入新文本信息 
  20. d 删除定位行 c\ 用新文本替换定位文件 
  21. s 使用替换模式替换相应关键字 r 从另一个文件中读文本 
  22. w 写文本到一个文件  y 传送字符  n 安静模式,只显示修改的 
  23.  
  24. ***【编程举例】*** 
  25. # cat file 
  26. The honeysuckle band played all night long for only $90. 
  27. It was an evening of splendid music and company. 
  28. Too bad the disco floor fell through at 23:10. 
  29. The local nurse Miss P.Neave was in attendance. 
  30.  
  31. 1、p(rint) 显示第二行 
  32. # sed '2p' file 
  33. The honeysuckle band played all night long for only $90. 
  34. It was an evening of splendid music and company. 
  35. It was an evening of splendid music and company. 
  36. Too bad the disco floor fell through at 23:10. 
  37. The local nurse Miss P.Neave was in attendance. 
  38.  
  39. # sed -n '2p' file 
  40. It was an evening of splendid music and company. 
  41.  
  42. 2、打印范围 1-3 
  43. # sed -n '1,3p' file 
  44. The honeysuckle band played all night long for only $90. 
  45. It was an evening of splendid music and company. 
  46. Too bad the disco floor fell through at 23:10. 
  47.  
  48. 3、打印关键字 Neave 
  49. # sed -n '/Neave/p' file 
  50. The local nurse Miss P.Neave was in attendance. 
  51.  
  52. 4、使用关键字和行号进行查询 The 
  53. # sed -n '/The/p' file 
  54. The honeysuckle band played all night long for only $90. 
  55. The local nurse Miss P.Neave was in attendance. 
  56.  
  57. # sed -n '4,/The/p' file  
  58. The local nurse Miss P.Neave was in attendance. 
  59.  
  60. 5、匹配元字符$    (必须使用\屏蔽特殊含义) 
  61. # sed -n '/\$/p' file 
  62. The honeysuckle band played all night long for only $90. 
  63.  
  64. 6、显示整个文件 
  65. # sed -n '1,$p' file 
  66. The honeysuckle band played all night long for only $90. 
  67. It was an evening of splendid music and company. 
  68. Too bad the disco floor fell through at 23:10. 
  69. The local nurse Miss P.Neave was in attendance. 
  70.  
  71. 7、任意以ing结尾的  后跟任意字母0次或多次,以ing结尾,模式为/.*ing/ 
  72. # sed -n '/.*ing/p' file  
  73. It was an evening of splendid music and company. 
  74.  
  75. 8、打印行首、打印最后一行 
  76. # sed -n '1p' file  
  77. The honeysuckle band played all night long for only $90. 
  78. # sed -n '$p' file  
  79. The local nurse Miss P.Neave was in attendance. 
  80.  
  81. 9、打印行号  (使用=号,格式为/pattern/=) 
  82. # sed -n '/music/=' file  
  83. 2 
  84. # sed -e '/music/=' file  
  85. The honeysuckle band played all night long for only $90. 
  86. 2 
  87. It was an evening of splendid music and company. 
  88. Too bad the disco floor fell through at 23:10. 
  89. The local nurse Miss P.Neave was in attendance. 
  90. 如果只关心行号及匹配行,则使用: 
  91. # sed -n -e '/music/p' -e '/music/=' file 
  92. It was an evening of splendid music and company. 
  93. 2 
  94.  
  95. 10、附加文本,使用 a\ ,可以将指定文本一行或多行附加到指定行。’\’表示换行 
  96. 举例:创建脚本append.sed 
  97. # vim append.sed 
  98. #!/bin/sed -f  
  99. /company/ a\ 
  100. Then suddenly it happened. 
  101. # chmod +x append.sed 
  102. # ./append.sed file  
  103. The honeysuckle band played all night long for only $90. 
  104. It was an evening of splendid music and company. 
  105. Then suddenly it happened. 
  106. Too bad the disco floor fell through at 23:10. 
  107. The local nurse Miss P.Neave was in attendance. 
  108.  
  109. 11、插入文本,类似于附加文本,只是它在行前面插入 
  110. 举例:创建脚本insert.sed 
  111. # vim insert.sed 
  112. #!/bin/sed -f  
  113. /attendance/ i\ 
  114. Utter confusion followed. 
  115. # chmod +x insert.sed 
  116. #./insert.sed file  
  117. The honeysuckle band played all night long for only $90. 
  118. It was an evening of splendid music and company. 
  119. Too bad the disco floor fell through at 23:10. 
  120. Utter confusion followed. 
  121. The local nurse Miss P.Neave was in attendance. 
  122.  
  123. 12、修改文本,修改命令将用新文本替代关键字所在行的文本 
  124. 举例:创建脚本change.sed 
  125. # vim change.sed 
  126. #!/bin/sed -f 
  127. /honeysuckle/ c\ 
  128. The Office Dibble band played well. 
  129. # chmod +x change.sed 
  130. #./change.sed file  
  131. The Office Dibble band played well. 
  132. It was an evening of splendid music and company. 
  133. Too bad the disco floor fell through at 23:10. 
  134. The local nurse Miss P.Neave was in attendance. 
  135.  
  136. 也可以使用行号来替换: 
  137. #!/bin/sed -f 
  138. 3 c\ 
  139. The Office Dibble band played well. 
  140.  
  141. 13、混合附加、插入、修改文本的脚本例子 
  142. # vim mix.sed 
  143. #!/bin/sed -f 
  144. #This is the change on line 1 
  145. 1 c\ 
  146. The Dibble band were grooving. 
  147. #Then insert a line 
  148. /evening/ i\ 
  149. They played some great tunes. 
  150. #change the last line, a $ means lasr line 
  151. $ c\ 
  152. Nurse Neave was too tipsy to help 
  153. #stick in a new line before the last line 
  154. 3 a\ 
  155. Where was the nurse to help? 
  156. # chmod +x mix.sed  
  157. # ./mix.sed file  
  158. The Dibble band were grooving. 
  159. They played some great tunes. 
  160. It was an evening of splendid music and company. 
  161. Too bad the disco floor fell through at 23:10. 
  162. Where was the nurse to help? 
  163. Nurse Neave was too tipsy to help 
  164.  
  165. 14、删除文本,可以是行号,行范围,最后一行,正则表达式匹配删除等 
  166. # sed '1d' file  
  167. It was an evening of splendid music and company. 
  168. Too bad the disco floor fell through at 23:10. 
  169. The local nurse Miss P.Neave was in attendance. 
  170. # sed '1,3d' file  
  171. The local nurse Miss P.Neave was in attendance. 
  172. # sed '$d' file  
  173. The honeysuckle band played all night long for only $90. 
  174. It was an evening of splendid music and company. 
  175. Too bad the disco floor fell through at 23:10. 
  176. # sed '/Neave/d' file  
  177. The honeysuckle band played all night long for only $90. 
  178. It was an evening of splendid music and company. 
  179. Too bad the disco floor fell through at 23:10. 
  180.  
  181. 15、替换文本,格式为[a,b]s/pre/post/[g p w n] 
  182. s 是一个替换操作,查询pre,替换为post 
  183. g 默认情况下只替换第一次匹配到的关键字,g为全局替换 
  184. p 默认sed将所有被替换的行都显示出来,加p选项则-n无效。 
  185. w 文件名,此选项将发生改变的行写入到另一个文件中 
  186. n 不打印输出结果 
  187. 举例: 
  188. # sed 's/night/NIGHT/' file  
  189. The honeysuckle band played all NIGHT long for only $90. 
  190. It was an evening of splendid music and company. 
  191. Too bad the disco floor fell through at 23:10. 
  192. The local nurse Miss P.Neave was in attendance. 
  193. # sed 's/The/Wow!/g' file  
  194. Wow! honeysuckle band played all night long for only $90. 
  195. It was an evening of splendid music and company. 
  196. Too bad the disco floor fell through at 23:10. 
  197. Wow! local nurse Miss P.Neave was in attendance. 
  198. # sed 's/splendid/SPLENDID/w sed.out' file (文件名在引号里边) 
  199. The honeysuckle band played all night long for only $90. 
  200. It was an evening of SPLENDID music and company. 
  201. Too bad the disco floor fell through at 23:10. 
  202. The local nurse Miss P.Neave was in attendance. 
  203. # cat sed.out  
  204. It was an evening of SPLENDID music and company. 
  205.  
  206. ***【使用替换修改字符串】*** 
  207. 要附加或修改一个字符传,可以使用&命令。&在查找出来的关键字前面加上自己的字符串 
  208. 格式为: s/nurse/"Hello"&/p 
  209. 举例: 
  210. # sed -n 's/nurse/"Hello" &/p' file  
  211. The local "Hello" nurse Miss P.Neave was in attendance. 
  212.  
  213. ***【将sed结果写入另一个文件】*** 
  214. 格式: [2,n] w filename 
  215. 举例: 
  216. # sed '1,2 w filedt' file (将1,2行输出到文件filedt中) 
  217. The honeysuckle band played all night long for only $90. 
  218. It was an evening of splendid music and company. 
  219. Too bad the disco floor fell through at 23:10. 
  220. The local nurse Miss P.Neave was in attendance. 
  221. # cat filedt  
  222. The honeysuckle band played all night long for only $90. 
  223. It was an evening of splendid music and company. 
  224. # sed '/Neave/ w dht' file (将关键字Neave所在行写入到文件dht中) 
  225. The honeysuckle band played all night long for only $90. 
  226. It was an evening of splendid music and company. 
  227. Too bad the disco floor fell through at 23:10. 
  228. The local nurse Miss P.Neave was in attendance. 
  229. # cat dht  
  230. The local nurse Miss P.Neave was in attendance. 
  231.  
  232. ***【从文件中读文本】*** 
  233. sed允许从另一个文件中读文本,并将其文本附加在当前文件,此命令放在匹配行后面 
  234. 举例: 
  235. # echo "Boom boom went to the music." > sedex.txt 
  236. # sed '/company/r sedex.txt' file (将文件sedex.txt的内容加到company行后) 
  237. The honeysuckle band played all night long for only $90. 
  238. It was an evening of splendid music and company. 
  239. Boom boom went to the music. 
  240. Too bad the disco floor fell through at 23:10. 
  241. The local nurse Miss P.Neave was in attendance. 
  242.  
  243. ***【匹配后退出】*** 
  244. 举例:查询/.a.*/, 
  245. # sed '/a/q' file (在第一行就查到了a关键字,退出) 
  246. The honeysuckle band played all night long for only $90. 
  247. # sed '/m/q' file (在第二行查询到m关键字,退出) 
  248. The honeysuckle band played all night long for only $90. 
  249. It was an evening of splendid music and company. 
  250.  
  251. ***【处理字符实例--处理控制字符】*** 
  252. # vim dos.txt 
  253. 12332##DISO##45.12^M 
  254. 00332##LPSO##23.11^M 
  255. 01299###USPD###34.46^M 
  256. a、用一个空格替换掉## 
  257. b、删除起始域中最前面的0 
  258. c、删除行尾控制字符 
  259. # sed 's/##*/ /g' dos.txt (替换##为空格) 
  260. 12332 DISO 45.12^M 
  261. 00332 LPSO 23.11^M 
  262. 01299 USPD 34.46^M 
  263. # sed 's/^0*//g' dos.txt  (将0替换掉) 
  264. 12332##DISO##45.12^M 
  265. 332##LPSO##23.11^M 
  266. 1299###USPD###34.46^M 
  267. # sed 's/\^M//g' dos.txt  (将^M替换掉) 
  268. 12332##DISO##45.12 
  269. 00332##LPSO##23.11 
  270. 01299###USPD###34.46 
  271.  
  272. ***【处理字符实例--处理报文输出】*** 
  273. # vim sql.txt 
  274. Database        Size(MB)        Date Created 
  275. -------------------------------------------- 
  276. GOSOUTH         2244            12/11/97 
  277. TRISUD          5632            8/9/99 
  278. (2 rows affected) 
  279.  
  280. 处理数据使得到下面的数据: 
  281. GOSOUTH 
  282. TRISUD 
  283.  
  284. 解决思路: 
  285. a、使用s/-*//g 删除横线------ 
  286. b、使用/^$/d 删除空行 
  287. c、使用$d 删除最后一行 
  288. d、使用1d删除第一行 
  289. e、使用awk{print $1}打印第一行 
  290.  
  291. # cat sql.txt | sed 's/-*//g' | sed '/^$/d' | sed '1d' | sed '$d' | awk '{print $1}' 
  292. GOSOUTH 
  293. TRISUD 
  294.  
  295. ***【处理字符实例--去除行首数字】*** 
  296. # vim UNH.txt 
  297. 12345UND  SPLLFC  234344 
  298. 9999999UND  SKKLT  3423 
  299. 1UND  SPLLY  434 
  300.  
  301. # sed 's/^[0-9]*//g' UNH.txt  
  302. UND  SPLLFC  234344 
  303. UND  SKKLT  3423 
  304. UND  SPLLY  434 
  305.  
  306. ***【处理字符实例--附加文本Passed】*** 
  307. # vim ok.txt 
  308. AC456   
  309. AC492169 
  310. AC9967 
  311. AC88345 
  312. # sed 's/[0-9][0-9]*/& Passed/g' ok.txt (&与Passed的位置关系决定了Passed的放在前还是后,这里是放在后面) 
  313. AC456 Passed     
  314. AC492169 Passed  
  315. AC9967 Passed    
  316. AC88345 Passed   
  317.  
  318. ***【处理字符实例--从shell向sed传值及从sed输出中设置shell变量】*** 
  319. # name="It's a go situation" 
  320. # replace=nice 
  321. # echo $name |sed "s/go/$replace/g" (注意双引号) 
  322. It's a nice situation 
  323.  
  324. # new_name=`echo $name |sed "s/go/$replace/g"` 
  325. # echo $new_name 
  326. It's a nice situation 
  327.  
  328. ***【快速一行命令集】*** 
  329. 's/\.$//g'  删除句尾的点 
  330. '-e /abcd/d'    删除包含abcd的行 
  331. 's/  */ /g'     删除一个以上的空格,用一个空格代替 
  332. 's/^  *//g' 删除行首空格 
  333. 's/\.  */ /g'   删除句点后跟两个或更多的空格,用一个空格代替 
  334. 's/^$/d'    删除空行 
  335. 's/^.//g'   删除行首字符 
  336. 's/COL\(...\)//g'   删除紧跟COL后的三个字母 
  337. 's/^\///g'  删除全文的/ 
  338. 's/^\///'   删除全文每一行出现的第一个/ 
  339. 's/ / //g' 
  340. 实例: 
  341. 1、删除路径名第一个/符号 
  342. # echo $PWD | sed 's/^\///'  
  343. root/Desktop 
  344.  
  345. 2、追加/插入文本 
  346. # echo "Mr Willis" | sed 's/Mr/& Bruce/g' 
  347. Mr Bruce Willis 
  348.  
  349. 3、删除首字符 
  350. # echo "accounts.doc" |sed 's/^.//' 
  351. ccounts.doc 
  352.  
  353. 4、删除文件扩展名 
  354. # echo "accounts.doc" |sed 's/\..*//g' 
  355. accounts 
  356.  
  357. 5、增加文件扩展名 
  358. # echo accounts | sed 's/$/&.doc/' 
  359. accounts.doc 
  360.  
  361. 6、替换字符系列(+变为of,%换为located) 
  362. # x="Department+payroll%Building G" 
  363. # echo $x |sed 's/+/ of /g' |sed 's/%/ located /g' 
  364. Department of payroll located Building G 
  365. (RHEL6成功  +和%不算是特殊字符吗?) 
2012-3-21练习笔记