------------------------------------------------------------------------- SEDå•行è"šæœ¬å¿«é€Ÿå'考(Unix æµç¼-è¾'器) 2005å¹´12月29æ-¥ 英æ-‡æ ‡é¢˜ï¼šUSEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) åŽŸæ ‡é¢˜ï¼šHANDY ONE-LINERS FOR SED (Unix stream editor) æ•´ç†ï¼šEric Pement - ç"µé'®ï¼špemente[at]northpark[dot]edu 版本5.5 è¯'者:Joe Hong - ç"µé'®ï¼šhq00e[at]126[dot]com 在以下地å€å¯æ‰¾åˆ°æœ¬æ-‡æ¡£çš"最æ-°ï¼ˆè‹±æ-‡ï¼‰ç‰ˆæœ¬ï¼š http://underpop.online.fr/s/sed/sed1line.txt http://www.pement.org/sed/sed1line.txt å…¶ä»-è¯è¨€ç‰ˆæœ¬ï¼š 䏿-‡ - http://underpop.online.fr/s/sed/sed1line_zh-cn.html æ·å…‹è¯ - http://underpop.online.fr/s/sed/sed1line_cz.html è·è¯ - http://underpop.online.fr/s/sed/sed1line_nl.html æ³•è¯ - http://underpop.online.fr/s/sed/sed1line_fr.html å¾·è¯ - http://underpop.online.fr/s/sed/sed1line_de.html è'¡è¯ - http://underpop.online.fr/s/sed/sed1line_pt-br.html æ-‡æœ¬é-´éš": -------- # 在æ¯ä¸€è¡ŒåŽé¢å¢žåŠ ä¸€ç©ºè¡Œ sed G # 将原æ¥çš"æ‰€æœ‰ç©ºè¡Œåˆ é™¤å¹¶åœ¨æ¯ä¸€è¡ŒåŽé¢å¢žåŠ ä¸€ç©ºè¡Œã€' # è¿™æ ·åœ¨è¾"出çš"æ-‡æœ¬ä¸æ¯ä¸€è¡ŒåŽé¢å°†æœ‰ä¸"åªæœ‰ä¸€ç©ºè¡Œã€' sed '/^$/d;G' # 在æ¯ä¸€è¡ŒåŽé¢å¢žåŠ ä¸¤è¡Œç©ºè¡Œ sed 'G;G' # 将第一个è"šæœ¬æ‰€äº§ç"Ÿçš"æ‰€æœ‰ç©ºè¡Œåˆ é™¤ï¼ˆå³åˆ é™¤æ‰€æœ‰å¶æ•°è¡Œï¼‰ sed 'n;d' # 在匹é…弿 ·â€œregexâ€çš"è¡Œä¹‹å‰æ'入一空行 sed '/regex/{x;p;x;}' # 在匹é…弿 ·â€œregexâ€çš"è¡Œä¹‹åŽæ'入一空行 sed '/regex/G' # 在匹é…弿 ·â€œregexâ€çš"行之å‰å'Œä¹‹åŽå"æ'入一空行 sed '/regex/{x;p;x;G;}' ç¼-å·ï¼š -------- # 为æ-‡ä»¶ä¸çš"æ¯ä¸€è¡Œè¿›è¡Œç¼-å·ï¼ˆç®€å•çš"左坹齿-¹å¼ï¼‰ã€'这里使ç"¨äº†â€œåˆ¶è¡¨ç¬¦â€ # (tabï¼Œè§æœ¬æ-‡æœ«å°¾å…³äºŽ'\t'çš"ç"¨æ³•çš"æè¿°ï¼‰è€Œä¸æ˜¯ç©ºæ ¼æ¥å¯¹é½è¾¹ç¼˜ã€' sed = filename | sed 'N;s/\n/\t/' # 对æ-‡ä»¶ä¸çš"所有行ç¼-å·ï¼ˆè¡Œå·åœ¨å·¦ï¼Œæ-‡å-å³ç«¯å¯¹é½ï¼‰ã€' sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /' # 对æ-‡ä»¶ä¸çš"所有行ç¼-å·ï¼Œä½†åªæ˜¾ç¤ºéžç©ºç™½è¡Œçš"行å·ã€' sed '/./=' filename | sed '/./N; s/\n/ /' # 计ç®-行数 (模拟 "wc -l") sed -n '$=' æ-‡æœ¬è½¬æ¢å'Œæ›¿ä»£ï¼š -------- # Unix环境:转æ¢DOSçš"æ-°è¡Œç¬¦ï¼ˆCR/LF)为Unixæ ¼å¼ã€' sed 's/.$//' # å‡è®¾æ‰€æœ‰è¡Œä»¥CR/LFç»"æŸ sed 's/^M$//' # 在bash/tcshä¸ï¼Œå°†æŒ‰Ctrl-Mæ"¹ä¸ºæŒ‰Ctrl-V sed 's/\x0D$//' # ssedã€gsed 3.02.80ï¼ŒåŠæ›´é«˜ç‰ˆæœ¬ # Unix环境:转æ¢Unixçš"æ-°è¡Œç¬¦ï¼ˆLF)为DOSæ ¼å¼ã€' sed "s/$/`echo -e \\\r`/" # 在ksh下所使ç"¨çš"å'½ä»¤ sed 's/$'"/`echo \\\r`/" # 在bash下所使ç"¨çš"å'½ä»¤ sed "s/$/`echo \\\r`/" # 在zsh下所使ç"¨çš"å'½ä»¤ sed 's/$/\r/' # gsed 3.02.80 åŠæ›´é«˜ç‰ˆæœ¬ # DOS环境:转æ¢Unixæ-°è¡Œç¬¦ï¼ˆLF)为DOSæ ¼å¼ã€' sed "s/$//" # æ-¹æ³• 1 sed -n p # æ-¹æ³• 2 # DOS环境:转æ¢DOSæ-°è¡Œç¬¦ï¼ˆCR/LF)为Unixæ ¼å¼ã€' # 下é¢çš"è"šæœ¬åªå¯¹UnxUtils sed 4.0.7 åŠæ›´é«˜ç‰ˆæœ¬æœ‰æ•ˆã€'è¦è¯†åˆ«UnxUtils版本çš" # sedå¯ä»¥é€šè¿‡å…¶ç‰¹æœ‰çš"“--textâ€é€‰é¡¹ã€'ä½ å¯ä»¥ä½¿ç"¨å¸®åŠ©é€‰é¡¹ï¼ˆâ€œ--helpâ€ï¼‰çœ‹ # 其䏿œ‰æ- 一个“--textâ€é¡¹ä»¥æ¤æ¥åˆ¤æ-所使ç"¨çš"æ˜¯å¦æ˜¯UnxUtils版本ã€'其它DOS # 版本çš"çš"sed则æ- 法进行这一转æ¢ã€'但å¯ä»¥ç"¨â€œtrâ€æ¥å®žçŽ°è¿™ä¸€è½¬æ¢ã€' sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 æˆ-更高版本 tr -d \r <infile >outfile # GNU tr 1.22 æˆ-更高版本 # å°†æ¯ä¸€è¡Œå‰å¯¼çš"“空白å-符â€ï¼ˆç©ºæ ¼ï¼Œåˆ¶è¡¨ç¬¦ï¼‰åˆ 除 # ä½¿ä¹‹å·¦å¯¹é½ sed 's/^[ \t]*//' # è§æœ¬æ-‡æœ«å°¾å…³äºŽ'\t'ç"¨æ³•çš"æè¿° # å°†æ¯ä¸€è¡Œæ‹-å°¾çš"“空白å-符â€ï¼ˆç©ºæ ¼ï¼Œåˆ¶è¡¨ç¬¦ï¼‰åˆ 除 sed 's/[ \t]*$//' # è§æœ¬æ-‡æœ«å°¾å…³äºŽ'\t'ç"¨æ³•çš"æè¿° # å°†æ¯ä¸€è¡Œä¸çš"å‰å¯¼å'Œæ‹-å°¾çš"空白å-ç¬¦åˆ é™¤ sed 's/^[ \t]*//;s/[ \t]*$//' # 在æ¯ä¸€è¡Œå¼€å¤´å¤"æ'å…¥5ä¸ªç©ºæ ¼ï¼ˆä½¿å…¨æ-‡å'å³ç§»åЍ5个å-符çš"ä½ç½®ï¼‰ sed 's/^/ /' # 以79个å-符为宽度,将所有æ-‡æœ¬å³å¯¹é½ sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78个å-符å¤-åŠ æœ€åŽçš"ä¸€ä¸ªç©ºæ ¼ # 以79个å-符为宽度,使所有æ-‡æœ¬å±…ä¸ã€'在æ-¹æ³•1ä¸ï¼Œä¸ºäº†è®©æ-‡æœ¬å±…䏿¯ä¸€è¡Œçš"å‰ # 头å'ŒåŽå¤´éƒ½å¡«å……äº†ç©ºæ ¼ã€' 在æ-¹æ³•2ä¸ï¼Œåœ¨å±…䏿-‡æœ¬çš"过程ä¸åªåœ¨æ-‡æœ¬çš"å‰é¢å¡«å…… # ç©ºæ ¼ï¼Œå¹¶ä¸"æœ€ç»ˆè¿™äº›ç©ºæ ¼å°†æœ‰ä¸€åŠä¼šè¢«åˆ 除ã€'æ¤å¤-æ¯ä¸€è¡Œçš"åŽå¤´å¹¶æœªå¡«å……ç©ºæ ¼ã€' sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # æ-¹æ³•1 sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # æ-¹æ³•2 # 在æ¯ä¸€è¡Œä¸æŸ¥æ‰¾å-串“fooâ€ï¼Œå¹¶å°†æ‰¾åˆ°çš"“fooâ€æ›¿æ¢ä¸ºâ€œbar†sed 's/foo/bar/' # åªæ›¿æ¢æ¯ä¸€è¡Œä¸çš"第一个“fooâ€å-串 sed 's/foo/bar/4' # åªæ›¿æ¢æ¯ä¸€è¡Œä¸çš"第四个“fooâ€å-串 sed 's/foo/bar/g' # å°†æ¯ä¸€è¡Œä¸çš"所有“fooâ€éƒ½æ¢æˆâ€œbar†sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替æ¢å€'数第二个“foo†sed 's/\(.*\)foo/\1bar/' # æ›¿æ¢æœ€åŽä¸€ä¸ªâ€œfoo†# åªåœ¨è¡Œä¸å‡ºçްå-串“bazâ€çš"情况下将“fooâ€æ›¿æ¢æˆâ€œbar†sed '/baz/s/foo/bar/g' # 将“fooâ€æ›¿æ¢æˆâ€œbarâ€ï¼Œå¹¶ä¸"åªåœ¨è¡Œä¸æœªå‡ºçްå-串“bazâ€çš"æƒ…å†µä¸‹æ›¿æ¢ sed '/baz/!s/foo/bar/g' # ä¸ç®¡æ˜¯â€œscarletâ€â€œrubyâ€è¿˜æ˜¯â€œpuceâ€ï¼Œä¸€å¾‹æ¢æˆâ€œred†sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数çš"sed都有效 gsed 's/scarlet\|ruby\|puce/red/g' # åªå¯¹GNU sed有效 # å€'置所有行,第一行æˆä¸ºæœ€åŽä¸€è¡Œï¼Œä¾æ¬¡ç±»æŽ¨ï¼ˆæ¨¡æ‹Ÿâ€œtacâ€ï¼‰ã€' # ç"±äºŽæŸäº›åŽŸå› ï¼Œä½¿ç"¨ä¸‹é¢å'½ä»¤æ-¶HHsed v1.5会将æ-‡ä»¶ä¸çš"ç©ºè¡Œåˆ é™¤ sed '1!G;h;$!d' # æ-¹æ³•1 sed -n '1!G;h;$p' # æ-¹æ³•2 # 将行ä¸çš"å-ç¬¦é€†åºæŽ'åˆ-,第一个å-æˆä¸ºæœ€åŽä¸€å-,……(模拟“revâ€ï¼‰ sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' # å°†æ¯ä¸¤è¡Œè¿žæŽ¥æˆä¸€è¡Œï¼ˆç±»ä¼¼â€œpasteâ€ï¼‰ sed '$!N;s/\n/ /' # å¦'æžœå½"å‰è¡Œä»¥åæ-œæ “\â€ç»"æŸï¼Œåˆ™å°†ä¸‹ä¸€è¡Œå¹¶åˆ°å½"å‰è¡Œæœ«å°¾ # 并去掉原æ¥è¡Œå°¾çš"åæ-œæ sed -e :a -e '/\\$/N; s/\\\n//; ta' # å¦'æžœå½"å‰è¡Œä»¥ç‰å·å¼€å¤´ï¼Œå°†å½"å‰è¡Œå¹¶åˆ°ä¸Šä¸€è¡Œæœ«å°¾ # 并以å•ä¸ªç©ºæ ¼ä»£æ›¿åŽŸæ¥è¡Œå¤´çš"“=†sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' # 为数å-å-ä¸²å¢žåŠ é€-å·åˆ†éš"符å·ï¼Œå°†â€œ1234567â€æ"¹ä¸ºâ€œ1,234,567†gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # å…¶ä»-sed # ä¸ºå¸¦æœ‰å°æ•°ç'¹å'Œè´Ÿå·çš"æ•°å€¼å¢žåŠ é€-å·åˆ†éš"符(GNU sed) gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta' # 在æ¯5行åŽå¢žåŠ ä¸€ç©ºç™½è¡Œ (在第5,10,15,20,ç‰è¡ŒåŽå¢žåŠ ä¸€ç©ºç™½è¡Œï¼‰ gsed '0~5G' # åªå¯¹GNU sed有效 sed 'n;n;n;n;G;' # å…¶ä»-sed 选择性地显示特定行: -------- # 显示æ-‡ä»¶ä¸çš"å‰10行 (模拟“headâ€çš"行为) sed 10q # 显示æ-‡ä»¶ä¸çš"第一行 (模拟“head -1â€å'½ä»¤ï¼‰ sed q # 显示æ-‡ä»¶ä¸çš"最åŽ10行 (模拟“tailâ€ï¼‰ sed -e :a -e '$q;N;11,$D;ba' # 显示æ-‡ä»¶ä¸çš"最åŽ2行(模拟“tail -2â€å'½ä»¤ï¼‰ sed '$!N;$!D' # 显示æ-‡ä»¶ä¸çš"最åŽä¸€è¡Œï¼ˆæ¨¡æ‹Ÿâ€œtail -1â€ï¼‰ sed '$!d' # æ-¹æ³•1 sed -n '$p' # æ-¹æ³•2 # 显示æ-‡ä»¶ä¸çš"å€'数第二行 sed -e '$!{h;d;}' -e x # å½"æ-‡ä»¶ä¸åªæœ‰ä¸€è¡Œæ-¶ï¼Œè¾"入空行 sed -e '1{$q;}' -e '$!{h;d;}' -e x # å½"æ-‡ä»¶ä¸åªæœ‰ä¸€è¡Œæ-¶ï¼Œæ˜¾ç¤ºè¯¥è¡Œ sed -e '1{$d;}' -e '$!{h;d;}' -e x # å½"æ-‡ä»¶ä¸åªæœ‰ä¸€è¡Œæ-¶ï¼Œä¸è¾"出 # åªæ˜¾ç¤ºåŒ¹é…æ£åˆ™è¡¨è¾¾å¼çš"行(模拟“grepâ€ï¼‰ sed -n '/regexp/p' # æ-¹æ³•1 sed '/regexp/!d' # æ-¹æ³•2 # åªæ˜¾ç¤ºâ€œä¸â€åŒ¹é…æ£åˆ™è¡¨è¾¾å¼çš"行(模拟“grep -vâ€ï¼‰ sed -n '/regexp/!p' # æ-¹æ³•1,与å‰é¢çš"å'½ä»¤ç›¸å¯¹åº" sed '/regexp/d' # æ-¹æ³•2,类似çš"è¯æ³• # 查找“regexpâ€å¹¶å°†åŒ¹é…行çš"上一行显示出æ¥ï¼Œä½†å¹¶ä¸æ˜¾ç¤ºåŒ¹é…行 sed -n '/regexp/{g;1!p;};h' # 查找“regexpâ€å¹¶å°†åŒ¹é…行çš"下一行显示出æ¥ï¼Œä½†å¹¶ä¸æ˜¾ç¤ºåŒ¹é…行 sed -n '/regexp/{n;p;}' # 显示包å«â€œregexpâ€çš"行åŠå…¶å‰åŽè¡Œï¼Œå¹¶åœ¨ç¬¬ä¸€è¡Œä¹‹å‰åŠ ä¸Šâ€œregexpâ€æ‰€ # 在行çš"è¡Œå· ï¼ˆç±»ä¼¼â€œgrep -A1 -B1â€ï¼‰ sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h # 显示包å«â€œAAAâ€ã€â€œBBBâ€æˆ-“CCCâ€çš"行(任æ"次åºï¼‰ sed '/AAA/!d; /BBB/!d; /CCC/!d' # å-串çš"次åºä¸å½±å"ç»"æžœ # 显示包å«â€œAAAâ€ã€â€œBBBâ€å'Œâ€œCCCâ€çš"行(固定次åºï¼‰ sed '/AAA.*BBB.*CCC/!d' # 显示包å«â€œAAAâ€â€œBBBâ€æˆ-“CCCâ€çš"行 (模拟“egrepâ€ï¼‰ sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多数sed gsed '/AAA\|BBB\|CCC/!d' # 对GNU sed有效 # 显示包å«â€œAAAâ€çš"æ®µè½ ï¼ˆæ®µè½é-´ä»¥ç©ºè¡Œåˆ†éš") # HHsed v1.5 必须在“x;â€åŽåŠ å…¥â€œG;â€ï¼ŒæŽ¥ä¸‹æ¥çš"3个è"šæœ¬éƒ½æ˜¯è¿™æ · sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' # 显示包å«â€œAAAâ€â€œBBBâ€å'Œâ€œCCCâ€ä¸‰ä¸ªå-串çš"æ®µè½ ï¼ˆä»»æ"次åºï¼‰ sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d' # 显示包å«â€œAAAâ€ã€â€œBBBâ€ã€â€œCCCâ€ä¸‰è€…ä¸ä»»ä¸€å-串çš"æ®µè½ ï¼ˆä»»æ"次åºï¼‰ sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # åªå¯¹GNU sed有效 # 显示包å«65个æˆ-以上å-符çš"行 sed -n '/^.\{65\}/p' # 显示包å«65个以下å-符çš"行 sed -n '/^.\{65\}/!p' # æ-¹æ³•1,与上é¢çš"è"šæœ¬ç›¸å¯¹åº" sed '/^.\{65\}/d' # æ-¹æ³•2,更简便一ç'¹çš"æ-¹æ³• # 显示部分æ-‡æœ¬â€"â€"ä»ŽåŒ…å«æ£åˆ™è¡¨è¾¾å¼çš"行开始到最åŽä¸€è¡Œç»"æŸ sed -n '/regexp/,$p' # 显示部分æ-‡æœ¬â€"â€"指定行å·èŒƒå›´ï¼ˆä»Žç¬¬8至第12行,å«8å'Œ12行) sed -n '8,12p' # æ-¹æ³•1 sed '8,12!d' # æ-¹æ³•2 # 显示第52行 sed -n '52p' # æ-¹æ³•1 sed '52!d' # æ-¹æ³•2 sed '52q;d' # æ-¹æ³•3, å¤"ç†å¤§æ-‡ä»¶æ-¶æ›´æœ‰æ•ˆçއ # 从第3行开始,æ¯7行显示一次 gsed -n '3~7p' # åªå¯¹GNU sed有效 sed -n '3,${p;n;n;n;n;n;n;}' # å…¶ä»-sed # 显示两个æ£åˆ™è¡¨è¾¾å¼ä¹‹é-´çš"æ-‡æœ¬ï¼ˆåŒ…å«ï¼‰ sed -n '/Iowa/,/Montana/p' # 区分大å°å†™æ-¹å¼ é€‰æ‹©æ€§åœ°åˆ é™¤ç‰¹å®šè¡Œï¼š -------- # 显示通篇æ-‡æ¡£ï¼Œé™¤äº†ä¸¤ä¸ªæ£åˆ™è¡¨è¾¾å¼ä¹‹é-´çš"内容 sed '/Iowa/,/Montana/d' # åˆ é™¤æ-‡ä»¶ä¸ç›¸é'»çš"é‡å¤è¡Œï¼ˆæ¨¡æ‹Ÿâ€œuniqâ€ï¼‰ # åªä¿ç•™é‡å¤è¡Œä¸çš"第一行,其ä»-è¡Œåˆ é™¤ sed '$!N; /^\(.*\)\n\1$/!P; D' # åˆ é™¤æ-‡ä»¶ä¸çš"é‡å¤è¡Œï¼Œä¸ç®¡æœ‰æ- 相é'»ã€'注æ"hold space所能æ"¯æŒçš"ç¼"å˜ # 大å°ï¼Œæˆ-者使ç"¨GNU sedã€' sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' # åˆ é™¤é™¤é‡å¤è¡Œå¤-çš"所有行(模拟“uniq -dâ€ï¼‰ sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' # åˆ é™¤æ-‡ä»¶ä¸å¼€å¤´çš"10行 sed '1,10d' # åˆ é™¤æ-‡ä»¶ä¸çš"最åŽä¸€è¡Œ sed '$d' # åˆ é™¤æ-‡ä»¶ä¸çš"最åŽä¸¤è¡Œ sed 'N;$!P;$!D;$d' # åˆ é™¤æ-‡ä»¶ä¸çš"最åŽ10行 sed -e :a -e '$d;N;2,10ba' -e 'P;D' # æ-¹æ³•1 sed -n -e :a -e '1,10!{P;N;D;};N;ba' # æ-¹æ³•2 # åˆ é™¤8çš"倿•°è¡Œ gsed '0~8d' # åªå¯¹GNU sed有效 sed 'n;n;n;n;n;n;n;d;' # å…¶ä»-sed # åˆ é™¤åŒ¹é…弿 ·çš"行 sed '/pattern/d' # åˆ é™¤å«patternçš"行ã€'å½"ç"¶pattern # å¯ä»¥æ¢æˆä»»ä½•有效çš"æ£åˆ™è¡¨è¾¾å¼ # åˆ é™¤æ-‡ä»¶ä¸çš"所有空行(与“grep '.' â€æ•ˆæžœç›¸åŒï¼‰ sed '/^$/d' # æ-¹æ³•1 sed '/./!d' # æ-¹æ³•2 # åªä¿ç•™å¤šä¸ªç›¸é'»ç©ºè¡Œçš"第一行ã€'å¹¶ä¸"åˆ é™¤æ-‡ä»¶é¡¶éƒ¨å'Œå°¾éƒ¨çš"空行ã€' # (模拟“cat -sâ€ï¼‰ sed '/./,/^$/!d' #æ-¹æ³•1ï¼Œåˆ é™¤æ-‡ä»¶é¡¶éƒ¨çš"空行,å…许尾部ä¿ç•™ä¸€ç©ºè¡Œ sed '/^$/N;/\n$/D' #æ-¹æ³•2,å…许顶部ä¿ç•™ä¸€ç©ºè¡Œï¼Œå°¾éƒ¨ä¸ç•™ç©ºè¡Œ # åªä¿ç•™å¤šä¸ªç›¸é'»ç©ºè¡Œçš"å‰ä¸¤è¡Œã€' sed '/^$/N;/\n$/N;//D' # åˆ é™¤æ-‡ä»¶é¡¶éƒ¨çš"所有空行 sed '/./,$!d' # åˆ é™¤æ-‡ä»¶å°¾éƒ¨çš"所有空行 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 对所有sed有效 sed -e :a -e '/^\n*$/N;/\n$/ba' # åŒä¸Šï¼Œä½†åªå¯¹ gsed 3.02.*有效 # åˆ é™¤æ¯ä¸ªæ®µè½çš"最åŽä¸€è¡Œ sed -n '/^$/{p;h;};/./{x;/./p;}' 特殊åº"ç"¨ï¼š -------- # 移除手册页(man page)ä¸çš"nroffæ ‡è®°ã€'在Unix System Væˆ-bash shell下使 # ç"¨'echo'å'½ä»¤æ-¶å¯èƒ½éœ€è¦åŠ ä¸Š -e 选项ã€' sed "s/.`echo \\\b`//g" # å¤-å±'çš"åŒæ‹¬å·æ˜¯å¿…é¡»çš"(Unix环境) sed 's/.^H//g' # 在bashæˆ-tcshä¸, 按 Ctrl-V 冿Œ‰ Ctrl-H sed 's/.\x08//g' # sed 1.5,GNU sed,ssed所使ç"¨çš"åå…进制çš"表示æ-¹æ³• # æå-æ-°é-»ç»"æˆ- e-mail çš"é'®ä»¶å¤´ sed '/^$/q' # åˆ é™¤ç¬¬ä¸€è¡Œç©ºè¡ŒåŽçš"所有内容 # æå-æ-°é-»ç»"æˆ- e-mail çš"æ£æ-‡éƒ¨åˆ† sed '1,/^$/d' # åˆ é™¤ç¬¬ä¸€è¡Œç©ºè¡Œä¹‹å‰çš"所有内容 # 从é'®ä»¶å¤´æå-“Subjectâ€ï¼ˆæ ‡é¢˜æ å-段),并移除开头çš"“Subject:â€å-æ · sed '/^Subject: */!d; s///;q' # 从é'®ä»¶å¤´èŽ·å¾-回å¤åœ°å€ sed '/^Reply-To:/q; /^From:/h; /./d;g;q' # 获å-é'®ä»¶åœ°å€ã€'在上一个è"šæœ¬æ‰€äº§ç"Ÿçš"é'£ä¸€è¡Œé'®ä»¶å¤´çš"基础上进一æ¥çš"å°†éžç"µé'® # 地å€çš"部分剃除ã€'(è§ä¸Šä¸€è"šæœ¬ï¼‰ sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//' # 在æ¯ä¸€è¡Œå¼€å¤´åŠ ä¸Šä¸€ä¸ªå°-括å·å'Œç©ºæ ¼ï¼ˆå¼•ç"¨ä¿¡æ¯ï¼‰ sed 's/^/> /' # å°†æ¯ä¸€è¡Œå¼€å¤´å¤"çš"å°-括å·å'Œç©ºæ ¼åˆ 除(解除引ç"¨ï¼‰ sed 's/^> //' # 移除大部分çš"HTMLæ ‡ç¾ï¼ˆåŒ…æ‹¬è·¨è¡Œæ ‡ç¾ï¼‰ sed -e :a -e 's/<[^>]*>//g;/</N;//ba' # 将分æˆå¤šå·çš"uuencodeæ-‡ä»¶è§£ç ã€'移除æ-‡ä»¶å¤´ä¿¡æ¯ï¼Œåªä¿ç•™uuencodeç¼-ç 部分ã€' # æ-‡ä»¶å¿…须以特定顺åºä¼ ç»™sedã€'下é¢ç¬¬ä¸€ç§ç‰ˆæœ¬çš"è"šæœ¬å¯ä»¥ç›´æŽ¥åœ¨å'½ä»¤è¡Œä¸‹è¾"入; # 第二ç§ç‰ˆæœ¬åˆ™å¯ä»¥æ"¾å…¥ä¸€ä¸ªå¸¦æ‰§è¡Œæƒé™çš"shellè"šæœ¬ä¸ã€'(ç"±Rahul Dhesiçš"一 # 个è"šæœ¬ä¿®æ"¹è€Œæ¥ã€') sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1 sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2 # å°†æ-‡ä»¶ä¸çš"段è½ä»¥å-æ¯é¡ºåºæŽ'åºã€'段è½é-´ä»¥ï¼ˆä¸€è¡Œæˆ-多行)空行分éš"ã€'GNU sed使ç"¨ # å-元“\vâ€æ¥è¡¨ç¤ºåž'直制表符,这里ç"¨å®ƒæ¥ä½œä¸ºæ¢è¡Œç¬¦çš"å ä½ç¬¦â€"â€"å½"ç"¶ä½ 也å¯ä»¥ # ç"¨å…¶ä»-未在æ-‡ä»¶ä¸ä½¿ç"¨çš"å-符æ¥ä»£æ›¿å®ƒã€' sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g' gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/' # 分别压缩æ¯ä¸ª.TXTæ-‡ä»¶ï¼ŒåŽ‹ç¼©åŽåˆ 除原æ¥çš"æ-‡ä»¶å¹¶å°†åŽ‹ç¼©åŽçš".ZIPæ-‡ä»¶ # å'½å为与原æ¥ç›¸åŒçš"åå-ï¼ˆåªæ˜¯æ‰©å±•åä¸åŒï¼‰ã€'(DOS环境:“dir /b†# 显示ä¸å¸¦è·¯å¾"çš"æ-‡ä»¶å)ã€' echo @echo off >zipup.bat dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat 使ç"¨SED:Sed接å-一个æˆ-多个ç¼-è¾'å'½ä»¤ï¼Œå¹¶ä¸"æ¯è¯»å…¥ä¸€è¡ŒåŽå°±ä¾æ¬¡åº"ç"¨è¿™äº›å'½ä»¤ã€' å½"读入第一行è¾"å…¥åŽï¼Œsed对其åº"ç"¨æ‰€æœ‰çš"å'½ä»¤ï¼Œç"¶åŽå°†ç»"æžœè¾"出ã€'接ç€å†è¯»å…¥ç¬¬äºŒ 行è¾"入,对其åº"ç"¨æ‰€æœ‰çš"å'½ä»¤â€¦â€¦å¹¶é‡å¤è¿™ä¸ªè¿‡ç¨‹ã€'上一个例åä¸sedç"±æ ‡å‡†è¾"入设 备(å³å'½ä»¤è§£é‡Šå™¨ï¼Œé€šå¸¸æ˜¯ä»¥ç®¡é"è¾"å…¥çš"å½¢å¼ï¼‰èŽ·å¾-è¾"å…¥ã€'在å'½ä»¤è¡Œç»™å‡ºä¸€ä¸ªæˆ-多 个æ-‡ä»¶å作为å'æ•°æ-¶ï¼Œè¿™äº›æ-‡ä»¶å-ä»£æ ‡å‡†è¾"入设备æˆä¸ºsedçš"è¾"å…¥ã€'sedçš"è¾"出将被 é€åˆ°æ ‡å‡†è¾"出(显示器)ã€'å› æ¤ï¼š cat filename | sed '10q' # 使ç"¨ç®¡é"è¾"å…¥ sed '10q' filename # åŒæ ·æ•ˆæžœï¼Œä½†ä¸ä½¿ç"¨ç®¡é"è¾"å…¥ sed '10q' filename > newfile # å°†è¾"出转移(é‡å®šå')到ç£ç›˜ä¸Š è¦äº†è§£sedå'½ä»¤çš"使ç"¨è¯´æ˜Žï¼ŒåŒ…括å¦'何通过è"šæœ¬æ-‡ä»¶ï¼ˆè€Œéžä»Žå'½ä»¤è¡Œï¼‰æ¥ä½¿ç"¨è¿™äº›å'½ 令,请å'阅《sed & awk》第二版,作者Dale Doughertyå'ŒArnold Robbins (O'Reilly,1997ï¼›http://www.ora.com),《UNIX Text Processing》,作者 Dale Doughertyå'ŒTim O'Reilly(Hayden Books,1987)æˆ-者是Mike Arst写çš"æ•™ 程â€"â€"压缩包çš"å称是“U-SEDIT2.ZIPâ€ï¼ˆåœ¨è®¸å¤šç«™ç'¹ä¸Šéƒ½æ‰¾å¾-到)ã€'è¦å'掘sed çš"潜力,则必须对“æ£åˆ™è¡¨è¾¾å¼â€æœ‰è¶³å¤Ÿçš"ç†è§£ã€'æ£åˆ™è¡¨è¾¾å¼çš"èµ"æ-™å¯ä»¥çœ‹ 《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)ã€' Unix系统所æä¾›çš"手册页(“manâ€ï¼‰ä¹Ÿä¼šæœ‰æ‰€å¸®åŠ©ï¼ˆè¯•ä¸€ä¸‹è¿™äº›å'½ä»¤ “man sedâ€ã€â€œman regexpâ€ï¼Œæˆ-者看“man edâ€ä¸å…³äºŽæ£åˆ™è¡¨è¾¾å¼çš"部分),但 手册æä¾›çš"ä¿¡æ¯æ¯"较“抽象â€â€"â€"这也是它一直为人所诟ç-…çš"ã€'ä¸è¿‡ï¼Œå®ƒæœ¬æ¥å°±ä¸ 是ç"¨æ¥æ•™åˆå¦è€…å¦'何使ç"¨sedæˆ-æ£åˆ™è¡¨è¾¾å¼çš"æ•™æï¼Œè€Œåªæ˜¯ä¸ºé'£äº›ç†Ÿæ'‰è¿™äº›å·¥å…·çš"人 æä¾›çš"一些æ-‡æœ¬å'考ã€' 括å·è¯æ³•:å‰é¢çš"例å对sedå'½ä»¤åŸºæœ¬ä¸Šéƒ½ä½¿ç"¨å•引å·ï¼ˆ'...')而éžåŒå¼•å· ï¼ˆ"..."ï¼‰è¿™æ˜¯å› ä¸ºsed通常是在Unixå¹³å°ä¸Šä½¿ç"¨ã€'å•引å·ä¸‹ï¼ŒUnixçš"shell(å'½ä»¤ 解释器)ä¸ä¼šå¯¹ç¾Žå…ƒç¬¦ï¼ˆ$)å'ŒåŽå¼•å·ï¼ˆ`...`)进行解释å'Œæ‰§è¡Œã€'而在åŒå¼•å·ä¸‹ 美元符会被展开为å˜é‡æˆ-å'æ•°çš"值,åŽå¼•å·ä¸çš"å'½ä»¤è¢«æ‰§è¡Œå¹¶ä»¥è¾"出çš"ç»"果代替 åŽå¼•å·ä¸çš"内容ã€'而在“cshâ€åŠå…¶è¡ç"Ÿçš"shellä¸ä½¿ç"¨æ"Ÿå¹å·ï¼ˆ!)æ-¶éœ€è¦åœ¨å…¶å‰ é¢åŠ ä¸Šè½¬ä¹‰ç"¨çš"åæ-œæ (就åƒè¿™æ ·ï¼š\!)以ä¿è¯ä¸Šé¢æ‰€ä½¿ç"¨çš"例å能æ£å¸¸è¿è¡Œ (包括使ç"¨å•引å·çš"情况下)ã€'DOS版本çš"Sed则一律使ç"¨åŒå¼•å·ï¼ˆ"..."ï¼‰è€Œä¸æ˜¯ 引巿¥åœˆèµ·å'½ä»¤ã€' '\t'çš"ç"¨æ³•:为了使本æ-‡ä¿æŒè¡Œæ-‡ç®€æ´ï¼Œæˆ'们在è"šæœ¬ä¸ä½¿ç"¨'\t'æ¥è¡¨ç¤ºä¸€ä¸ªåˆ¶è¡¨ 符ã€'但是现在大部分版本çš"sed还ä¸èƒ½è¯†åˆ«'\t'çš"简写æ-¹å¼ï¼Œå› æ¤å½"在å'½ä»¤è¡Œä¸ä¸º è"šæœ¬è¾"入制表符æ-¶ï¼Œä½ åº"该直接按TABé"®æ¥è¾"å…¥åˆ¶è¡¨ç¬¦è€Œä¸æ˜¯è¾"å…¥'\t'ã€'下åˆ-çš"å·¥ 具软件都æ"¯æŒ'\t'åšä¸ºä¸€ä¸ªæ£åˆ™è¡¨è¾¾å¼çš"å-å…ƒæ¥è¡¨ç¤ºåˆ¶è¡¨ç¬¦ï¼šawkã€perlã€HHsed〠sedmod以åŠGNU sed v3.02.80ã€' ä¸åŒç‰ˆæœ¬çš"SED:ä¸åŒçš"版本é-´çš"sed会有些ä¸åŒä¹‹å¤",å¯ä»¥æƒ³è±¡å®ƒä»¬ä¹‹é-´åœ¨è¯æ³•上 会有差å¼'ã€'å…·ä½"而言,它们ä¸å¤§éƒ¨åˆ†ä¸æ"¯æŒåœ¨ç¼-è¾'å'½ä»¤ä¸é-´ä½¿ç"¨æ ‡ç¾ï¼ˆ:name)æˆ-分 æ"¯å'½ä»¤ï¼ˆb,tï¼‰ï¼Œé™¤éžæ˜¯æ"¾åœ¨é'£äº›çš"末尾ã€'这篇æ-‡æ¡£ä¸æˆ'们尽é‡é€‰ç"¨äº†å¯ç§»æ¤æ€§è¾ƒé«˜ çš"è¯æ³•,以使大多数版本çš"sedçš"ç"¨æˆ·éƒ½èƒ½ä½¿ç"¨è¿™äº›è"šæœ¬ã€'ä¸è¿‡GNU版本çš"sedå…许使 ç"¨æ›´ç®€æ´çš"è¯æ³•ã€'想åƒä¸€ä¸‹å½"读者看到一个很长çš"å'½ä»¤æ-¶çš"心情: sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d å¥½æ¶ˆæ¯æ˜¯GNU sed能让å'½ä»¤æ›´ç´§å‡': sed '/AAA/b;/BBB/b;/CCC/b;d' # ç"šè‡³å¯ä»¥å†™æˆ sed '/AAA\|BBB\|CCC/b;d' æ¤å¤-,请注æ"虽ç"¶è®¸å¤šç‰ˆæœ¬çš"sed接å-象“/one/ s/RE1/RE2/â€è¿™ç§åœ¨'s'å‰å¸¦æœ‰ç©º æ ¼çš"å'½ä»¤ï¼Œä½†è¿™äº›ç‰ˆæœ¬ä¸æœ‰äº›å´ä¸æŽ¥å-è¿™æ ·çš"å'½ä»¤:“/one/! s/RE1/RE2/â€ã€'è¿™æ-¶ åªéœ€è¦æŠŠä¸é-´çš"ç©ºæ ¼åŽ»æŽ‰å°±è¡Œäº†ã€' 速度优åŒ-:å½"ç"±äºŽæŸç§åŽŸå› ï¼ˆæ¯"å¦'è¾"å…¥æ-‡ä»¶è¾ƒå¤§ã€å¤"ç†å™¨æˆ-硬盘较慢ç‰ï¼‰éœ€è¦æé«˜ å'½ä»¤æ‰§è¡Œé€Ÿåº¦æ-¶ï¼Œå¯ä»¥è€ƒè™'在替æ¢å'½ä»¤ï¼ˆâ€œs/.../.../â€ï¼‰å‰é¢åŠ ä¸Šåœ°å€è¡¨è¾¾å¼æ¥ æé«˜é€Ÿåº¦ã€'举例æ¥è¯´ï¼š sed 's/foo/bar/g' filename # æ ‡å‡†æ›¿æ¢å'½ä»¤ sed '/foo/ s/foo/bar/g' filename # 速度更快 sed '/foo/ s//bar/g' filename # ç®€å†™å½¢å¼ å½"åªéœ€è¦æ˜¾ç¤ºæ-‡ä»¶çš"å‰é¢çš"部分æˆ-需è¦åˆ 除åŽé¢çš"内容æ-¶ï¼Œå¯ä»¥åœ¨è"šæœ¬ä¸ä½¿ç"¨â€œq†å'½ä»¤ï¼ˆé€€å‡ºå'½ä»¤ï¼‰ã€'在å¤"ç†å¤§çš"æ-‡ä»¶æ-¶ï¼Œè¿™ä¼šèŠ'çœå¤§é‡æ-¶é-´ã€'å› æ¤ï¼š sed -n '45,50p' filename # 显示第45到50行 sed -n '51q;45,50p' filename # ä¸€æ ·ï¼Œä½†å¿«å¾-多 å¦'æžœä½ æœ‰å…¶ä»-çš"å•行è"šæœ¬æƒ³ä¸Žå¤§å®¶åˆ†äº«æˆ-è€…ä½ å'现了本æ-‡æ¡£ä¸é"™è¯¯çš"地æ-¹ï¼Œè¯·å'ç"µ åé'®ä»¶ç»™æœ¬æ-‡æ¡£çš"作者(Eric Pement)ã€'é'®ä»¶ä¸è¯·è®°å¾-æä¾›ä½ 所使ç"¨çš"sed版本〠该sed所è¿è¡Œçš"æ"作系统åŠå¯¹é-®é¢˜çš"é€'å½"æè¿°ã€'本æ-‡æ‰€æŒ‡çš"å•行è"šæœ¬æŒ‡å'½ä»¤è¡Œçš"é•¿ 度在65个å-符æˆ-65个以下çš"sedè"šæœ¬ã€"è¯'注1〕ã€'本æ-‡æ¡£çš"å"ç§è"šæœ¬æ˜¯ç"±ä»¥ä¸‹æ‰€åˆ-作 者所写æˆ-æä¾›ï¼š Al Aab # 建立了“sedersâ€é'®ä»¶åˆ-表 Edgar Allen # 许多æ-¹é¢ Yiorgos Adamopoulos # 许多æ-¹é¢ Dale Dougherty # 《sed & awk》作者 Carlos Duarte # 《do it with sed》作者 Eric Pement # 本æ-‡æ¡£çš"作者 Ken Pizzini # GNU sed v3.02 çš"作者 S.G. Ravenhall # 去htmlæ ‡ç¾è"šæœ¬ Greg Ubben # 有诸多贡献并æä¾›äº†è®¸å¤šå¸®åŠ© ------------------------------------------------------------------------- è¯'注1:大部分情况下,sedè"šæœ¬æ- 论多长都能写æˆå•行çš"å½¢å¼ï¼ˆé€šè¿‡`-e'选项å'Œ`;' å·ï¼‰â€"â€"åªè¦å'½ä»¤è§£é‡Šå™¨æ"¯æŒï¼Œæ‰€ä»¥è¿™é‡Œè¯´çš"å•行è"šæœ¬é™¤äº†èƒ½å†™æˆä¸€è¡Œè¿˜å¯¹é•¿åº¦æœ‰ 所é™åˆ¶ã€'å› ä¸ºè¿™äº›å•行è"šæœ¬çš"æ"义ä¸åœ¨äºŽå®ƒä»¬æ˜¯ä»¥å•行çš"å½¢å¼å‡ºçްã€'而是让ç"¨æˆ·èƒ½ æ-¹ä¾¿åœ°åœ¨å'½ä»¤è¡Œä¸ä½¿ç"¨è¿™äº›ç´§å‡'çš"è"šæœ¬æ‰æ˜¯å…¶æ"义所在ã€'