Skip to content

Instantly share code, notes, and snippets.

@illy
Created February 20, 2012 08:22
Show Gist options
  • Save illy/1868393 to your computer and use it in GitHub Desktop.
Save illy/1868393 to your computer and use it in GitHub Desktop.
Chinese Translation of Get sed savvy

#Get sed savvy – part 1#

Original post

今天我將繼續介紹命令行工具,主題是sed。(Stream EDitor)是目前介紹過最複雜的工具,它自成一體。把他們放在一篇裡面會太擁擠,所以我會分開介紹。

sed的精華是檢索和替換,所以我們將從這裡開始,然後延伸到其他。

##教程##

如果你在Win平台上的話,請安裝Crywin或者類似的工具。sed也使用正則式,所以你可能需要一個正則式的手冊。

“sed一行行地有序讀取數據,調取命令,然後一行行地輸出”

sed 's/#FF0000/#0000FF/g' main.css

我們可以這樣理解:在main.css裡全局[/g]搜索[s/]紅色[#FF0000/],然後用藍色替代[#0000FF]。注意兩點:

  1. sed並沒有修改文件,只是在屏幕上輸出結果;

  2. 如果我們不使用"g",那麼sed只會替換第一個匹配結果。

所以我們可以這樣來修改:

sed -i -r 's/#(FF0000|F00)b/#0F0/g' main.css

可以從前面那個find教程中找到這個例子:在css文件中用綠色替換紅色。-r選項是提供額外的正則式輔助。Sheila在find那個帖子的回覆中指出,sed的-i在Solaris系統上無效,所以她建議用類似

perl -e s///g -i

來替代。

假設我們要更改所有的顏色設置,可能最佳方式就是使用類似這樣的sed腳本:

# sedscript - one command per line
s/#00CC00/#9900CC/g
s/#990099/#000000/g
s/#0000FF/#00FF00/g
...

# use sedscript with -f

sed -i -f sedscript *.css

sedscropt自然就是我們剛創建的那個腳本。注意,我們不需要在腳本中引用這句。這樣,我們就可以替換css文件中的所有顏色配置。

##其他例子##

# Trim whitespace from beginning and end of line 刪除開頭的空白
# You *might* have to type a tab instead of t here depending on your version of sed 不通的系統可能使用不同的sed,所以你可能使用tab來代替智力的\t.
sed -r 's/^[ t]*//;s/[ t]*$//g'

# Delete all occurances of foo 刪除文本中所有的foo
sed 's/foo//g'

##結語##

現在你大概能夠理解怎樣用單行的sed命令來修改很多文件了吧?好好使用它們將大大提高你的效率。

這兒有幾個不錯的sed教程(當然也包括本頁啦!):

USEFUL ONE-LINE SCRIPTS FOR SED – Eric Pement

Sed - UNIX Stream Editor - Cheat Sheet – Peteris Krumins

我敢說,我90%的sed的腳本都是用來檢索替換的,所以你已經很快入門了。當然,如我之前所言,sed有太多的變化,所以我會慢慢介紹刪除,增加行號,輸出特定行,以及其他一些技巧。最後,希望你們可以在評論中分享你們最喜歡的sed命令。

#Get sed savvy – part 2#

Original post

現在你已經有所了解Stream EDitor了,讓我們來拓展關於替換和行輸出的知識吧。

假設,我們希望讓他人理解我們在一個簡單的css或者javascript文件中使用了哪些function,比如。我們想要檢查最近的所有修改,然後提取所有的註釋,並將他們輸出到另一文件(比如wiki)。如果能夠自動完成這些,將大大提高我們的效率和團隊合作

##教程##

如果你在Win平台下的話,請安裝Cygwin。

# 提取單行註釋- 當然用grep更好,不過,我們也可以用sed
sed -n '///p' blah.js > /tmp/comments.out

# 提取多行註釋
sed -n '//*/,/*//p' blah.js >> /tmp/comments.out

這些sed語句比較複雜,我們可以這樣來理解: -n告訴sed先不要輸出結果,直到你告訴它到底輸出什麼為止。那個逗號讓sed匹配前後兩個語句之間的所有內容。在這個例子中,所有在/*和*/兩個語句間的內容都會通過p(打印)輸出。

當然,我們可以把這樣兩個命令結合到一塊,成為一個殺手級的應用。

# sed script file
////p
//*/,/*//p

# 使用sed輸出所有註釋
sed -n -f sedscr blah.js > /tmp/comments.out

這樣一來,我們就有了一個不錯的javascript註釋文件,我們可以放到wiki上,也可以用來比較版本的不同。注意,sed輸出的是整行,如果你僅僅需要的是某個註釋的結尾,通常會連開頭一併得到。雖然不是一個完美的方案,但至少快捷方便。

##其他例子##

#輸出所有超過八十個字母的行
sed -n '/^.{81}/p' myfile

#刪除空白行
sed '/^$/d' myfile

#優化速度的替代
sed '/Yahoo/ s//Not Microhoo/g' myfile

##結語##

如此一來,你應該已經比較熟悉sed了,和find,grep一起使用,將幫助你更好地適應命令行工具。

我建議你們試著使用這些命令,並且在一些不必要的情況下使用這些,以期能夠熟悉他們。今後你們就可以藉助這些工具大大提高效率了。

#Get sed savvy – part 3#

Original post

現在我們將學習sed的刪除(d), 讀取(r)和寫(w)命令,這樣你們的sed工具包就更加強大了。將要介紹的內容將幫助你們解決99%適用sed的任務。

我們將會繼續介紹awk之類的工具,如果你還沒準備好,請安裝Cygwin並回顧前面兩個部份。

##教程##

重複使用某些代碼的最好方式就是使用模板。借助sed,你可以大大提高利用模板的效率。

假設我們有一個經常使用的html模板,看起來像這樣:

?
01
02
03
04
05
06
07
08
09
10
11
<html>
	<head>
    	<title>template.html</title>
 	</head>
	<body>
    	<div id="nav">Navigation here</div>
    	<div id="content">
%%CONTENT%%
    	</div>
	</body>
</html>

我們想要用一個htmlf文件替換其中的“%%CONTENT%%"。這個語句很簡單:‘//r’:

sed '/^%%CONTENT%%/r fragment.htmlf' template.html

這個腳本會在"%%CONTENT%%"添加fragment.htmlf的內容,所以我們可以利用刪除選項來修改:

sed -e '/^%%CONTENT%%/r fragment.htmlf' -e '/^%%CONTENT%%/d' template.html > whole.html

這個看起來似乎無用,但它最大的威力在於簡潔。每次當我試圖生成一些wiki或者html文本的時候,這一腳本威力無窮。

再來看另一個寫選項(w)。假設我們試圖根據最後一列的值來分割一個csv文件。我們可以使用grep,awk(即將介紹),但是用sed將大大提高效率:

#sedscript file
/,[0-9]+$/w numbers.csv
/,[A-Za-z]+/w letters.csv
/,[^A-Za-z0-9]+/w symbols.csv

sed -r -f sedscript original.csv

如此一來,numbers.csv將包含所有最後一列為數字的行,letters.csv和sumbols.csv也是如此。這個腳本或許可以幫助你將一個極大的地址簿分割為幾個文件。這僅僅是一個簡單的例子,你或許可以想到一些更加複雜的方式。

##其他例子#

?
1
2
3
4
5
6
#輸出<html>標籤外的所有內容

sed '/<html>/,/</html>/d' myfile.html

#轉換DOS的rn為Unix的n
sed 's/$//' myfile        #Windows
sed 's/.$//' myfile       #Linux/UNIX

##結論##

你們已經學習了部分sed命令,它們或許可以幫助你更好地編輯文本或者搜索文本。你們可以生成一些可執行腳本,這樣直接調用。一個很酷的腳本可以從某些​​文件中查找所有的註釋並把他們輸出到wiki上。這樣一來,團隊合作就更加緊密了,對吧?

當然,你可以把這些添加到書籤,但是只有嘗試過之後,你們才能牢牢掌握他們。請分享你們的經驗和命令行列表,這樣最棒!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment