Thank Eric Wendelins very much, because he agreed me to translate and republish his posts.
Yes, you may translate any of my articles and post them. Attribution would be appreciated, but not required.
Thanks a lot!
Cheers,
Eric
Get sed savvy – part 1
今天我將繼續介紹命令行工具,主題是sed。(Stream EDitor)是目前介紹過最複雜的工具,它自成一體。把他們放在一篇裡面會太擁擠,所以我會分開介紹。
sed的精華是檢索和替換,所以我們將從這裡開始,然後延伸到其他。
教程
如果你在Win平台上的話,請安裝Crywin或者類似的工具。sed也使用正則式,所以你可能需要一個正則式的手冊。
“sed一行行地有序讀取數據,調取命令,然後一行行地輸出”
sed 's/#FF0000/#0000FF/g' main.css
我們可以這樣理解:在main.css裡全局[/g]搜索[s/]紅色[#FF0000/],然後用藍色替代[#0000FF]。注意兩點:
sed並沒有修改文件,只是在屏幕上輸出結果;
如果我們不使用"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
現在你已經有所了解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
現在我們將學習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%%“。這個語句很簡單:‘/
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上。這樣一來,團隊合作就更加緊密了,對吧?
當然,你可以把這些添加到書籤,但是只有嘗試過之後,你們才能牢牢掌握他們。請分享你們的經驗和命令行列表,這樣最棒!
0 comments:
Post a Comment