標籤:style blog color io 使用 java ar for 檔案
sed是一個非互動性性文字編輯器, 它編輯檔案或標準輸入匯出的檔案拷貝。標準輸入可能是來自鍵盤、檔案重新導向、字串或變數,或者是一個管道檔案。sed可以隨意編輯小或大的檔案,有許多 sed命令用來編輯、刪除,並允許做這項工作時不在現場。sed一次性處理所有改變,因而變得很有效,對使用者來說,最重要的是節省了時間。sed必須通過行號和Regex指定要改變的文本行sed怎樣讀取資料: sed從檔案的一個文本行或從標準輸入的幾種格式中讀取資料,將之拷貝到一個編輯緩衝區,然後讀命令列或指令碼的第一條命令,並使用這些命令尋找模式或定位行號編輯它,重複過程直到命令結束sed命令的調用: 在命令列鍵入命令;將sed命令插入指令檔,然後調用sed;將sed命令插入指令檔,並使sed指令碼可執行 sed [option] sed命令 輸入檔案 在命令列使用sed命令,實際命令要加單引號 sed [option] -f sed指令檔 輸入檔案 使用sed指令檔 sed指令檔 [option] 輸入檔案 第一行具有sed命令直譯器的sed指令檔 option如下: n 不列印; sed不寫編輯行到標準輸出,預設為列印所有行(編輯和未編輯),p命令可以用來列印編輯行 c 下一命令是編輯命令,使用多項編輯時加入此選項 f 如果正在調用sed指令檔,使用此選項,此選項通知sed一個指令檔支援所用的sed命令,如 sed -f myscript.sed input_file 這裡myscript.sed即為支援sed命令的檔案 使用重新導向檔案即可儲存sed的輸出使用sed在文本中定位文本的方式: x x為一行號,比如1 x,y 表示行號範圍從x到y,如2,5表示從第2行到第5行 /pattern/ 查詢包含模式的行,如/disk/或/[a-z]/ /pattern/pattern/ 查詢包含兩個模式的行,如/disk/disks/ /pattern/,x 在給定行號上查詢包含模式的行,如/disk/,3 x,/pattern/ 通過行號和模式查詢匹配行,如 3,/disk/ x,y! 查詢不包含指定行號x和y的行基本sed編輯命令: p 列印匹配行 c/ 用新文本替換定位文本 = 顯示檔案行號 s 使用替換模式替換相應模式 a/ 在定位行號後附加新文本資訊 r 從另一個文本中讀文本 i/ 在定位行號後插入新文本資訊 w 寫文本到一個檔案 d 刪除定位行 q 第一個模式比對完成後退出或立即退出 l 顯示與八進位ASCII代碼等價的控制字元 y 傳送字元 n 從另一個文本中讀文本下一行,並附加在下一行 {} 在定位行執行的命令組 g 將模式2粘貼到/pattern n/基本sed編程舉例: 使用p(rint)顯示行: sed -n ‘2p‘ temp.txt 只顯示第2行,使用選項n 列印範圍: sed -n ‘1,3p‘ temp.txt 列印第1行到第3行 列印模式: sed -n ‘/movie/‘p temp.txt 列印含movie的行 使用模式和行號查詢: sed -n ‘3,/movie/‘p temp.txt 只在第3行尋找movie並列印 顯示整個檔案: sed -n ‘1,$‘p temp.txt $為最後一行 任一字元: sed -n ‘/.*ing/‘p temp.txt 注意是.*ing,而不是*ing 列印行號: sed -e ‘/music/=‘ temp.txt 附加文本:(建立sed指令檔)chmod u+x script.sed,運行時./script.sed temp.txt #!/bin/sed -f /name1/ a/ #a/表示此處換行添加文本 HERE ADD NEW LINE. #添加的常值內容 插入文本: /name1/ a/ 改成 4 i/ 4表示行號,i插入 修改文本: /name1/ a/ 改成 /name1/ c/ 將修改整行,c修改 刪除文本: sed ‘1d‘ temp.txt 或者 sed ‘1,4d‘ temp.txt 替換文本: sed ‘s/source/OKSTR/‘ temp.txt 將source替換成OKSTR sed ‘s//$//g‘ temp.txt 將文本中所有的$符號全部刪除 sed ‘s/source/OKSTR/w temp2.txt‘ temp.txt 將替換後的記錄寫入檔案temp2.txt 替換修改字串: sed ‘s/source/"ADD BEFORE" &/p‘ temp.txt 結果將在source字串前面加上"ADD BEFORE",這裡的&表示找到的source字元並儲存 sed結果寫入到檔案: sed ‘1,2 w temp2.txt‘ temp.txt sed ‘/name/ w temp2.txt‘ temp.txt 從檔案中讀文本: sed ‘/name/r temp2.txt‘ temp.txt 在每列最後加文本: sed ‘s/[0-9]*/& Pass/g‘ temp.txt 從shell向sed傳值: echo $NAME | sed "s/go/$REP/g" 注意需要使用雙引號快速一行命令: ‘s//.$//g‘ 刪除以句點結尾行 ‘-e /abcd/d‘ 刪除包含abcd的行 ‘s/[][][]*/[]/g‘ 刪除一個以上空格,用一個空格代替 ‘s/^[][]*//g‘ 刪除行首空格 ‘s//.[][]*/[]/g‘ 刪除句號後跟兩個或更多的空格,用一個空格代替 ‘/^$/d‘ 刪除空行 ‘s/^.//g‘ 刪除第一個字元,區別 ‘s//.//g‘刪除所有的句點 ‘s/COL/(.../)//g‘ 刪除緊跟COL的後三個字母 ‘s/^////g‘ 刪除路徑中第一個////////////////////////////////////////////////////////////////////////、使用句點匹配單字元 句點“.”可以匹配任意單字元。“.”可以匹配字串頭,也可以是中間任一字元。假定正在過濾一個文字檔,對於一個有1 0個字元的指令碼集,要求前4個字元之後為X C,匹配操作如下:. . . .X C. . . .2、在行首以^匹配字串或字元序列 ^只允許在一行的開始匹配字元或單詞。在行首第4個字元為1,匹配動作表示為:^ . . . 13、在行尾以$匹配字串或字元 可以說$與^正相反,它在行尾匹配字串或字元, $符號放在匹配單詞後。如果在行尾匹配單詞j e t 0 1,操作如下:j e t 0 1 $ 如果只返回包含一個字元的行,操作如下:^ . $4、使用*匹配字串中的單字元或其重複序列 使用此特殊字元匹配任一字元或字串的重複多次運算式。5、使用/屏蔽一個特殊字元的含義 有時需要尋找一些字元或字串,而它們包含了系統指定為特殊字元的一個字元。如果要在Regex中匹配以* . p a s結尾的所有檔案,可做如下操作:/ * / . p a s6、使用[]匹配一個範圍或集合 使用[ ]匹配特定字串或字串集,可以用逗號將括弧內要匹配的不同字串分開,但並不強制要求這樣做(一些系統提倡在複雜的運算式中使用逗號),這樣做可以增 加模式的可讀性。使用“ -”表示一個字串範圍,表明字串範圍從“ -”左邊字元開始,到“ -”右邊字元結束。假定要匹配任意一個數字,可以使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,則使用:[ A - Z a - z ]表明從A - Z、a - z的字母範圍。7、使用/{/}匹配模式結果出現的次數 使用*可匹配所有匹配結果任意次,但如果只要指定次數,就應使用/ { / },此模式有三種形式,即: pattern/{n/} 匹配模式出現n次。 pattern/{n,/} 匹配模式出現最少n次。 pattern/{n,m} 匹配模式出現n到m次之間,n , m為0 - 2 5 5中任意整數。 匹配字母A出現兩次,並以B結尾,操作如下:A / { 2 / } B匹配值為A A B 匹配A至少4次,使用:A / { 4 , / } B 在s h e l l編程中,一段好的指令碼與完美的指令碼間的差別之一,就是要熟知Regex並學會使用它們。相比較起來,用一個命令抽取一段文本比用三四個命令得出同樣的結果要節省許多時間。//////////////////////////////////////////////////////////////////Regex使用詳解(一) 2000-04-26呂曉波 如果我們問那些UNIX系統的愛好者他們最喜歡什麼,答案除了穩定 的系統和可以遠程啟動之外,十有八九的人會提到Regex;如果我們再問他們最頭痛的是什麼,可能除了複雜的進程式控制制和安裝過程之外,還會是Regex。 那麼Regex到底是什嗎?如何才能真正的掌握Regex並正確的加以靈活運用?本文將就此展開介紹,希望能夠對那些渴望瞭解和掌握Regex的讀者有所 助益。 入門簡介 簡單的說,Regex是一種可以用於模式比對和替換的強有力的工具。我們可以在幾乎所 有的基於UNIX系統的工具中找到Regex的身影,例如,vi編輯器,Perl或PHP指令碼語言,以及awk或sed shell程式等。此外,象JavaScript這種用戶端的指令碼語言也提供了對Regex的支援。由此可見,Regex已經超出了某種語言或某個系統的 局限,成為人們廣為接受的概念和功能。 Regex可以讓使用者通過使用一系列的特殊字元構建匹配模式,然後把匹配模式與資料檔案、程式輸入以及WEB頁面的表單輸入等目標對象進行比較,根據比較對象中是否包含匹配模式,執行相應的程式。 舉例來說,Regex的一個最為普遍的應用就是用於驗證使用者線上輸入的郵件地址的格式是否正確。如果通過Regex驗證使用者郵件地址的格式正確,使用者所 填寫的表單資訊將會被正常處理;反之,如果使用者輸入的郵件地址與正則表達的模式不匹配,將會彈出提示資訊,要求使用者重新輸入正確的郵件地址。由此可見正則 運算式在WEB應用的邏輯判斷中具有舉足輕重的作用。 基本文法 在對Regex的功能和作用有了初步的瞭解之後,我們就來具體看一下Regex的文法格式。 Regex的形式一般如下: /love/ 其中位於“/”定界符之間的部分就是將要在目標對象中進行匹配的模式。使用者只要把希望尋找匹配對象的模式內容放入“/”定界符之間即可。為了能夠使使用者 更加靈活的定製模式內容,Regex提供了專門的“元字元”。所謂元字元就是指那些在Regex中具有特殊意義的專用字元,可以用來規定其前置字元(即位 於元字元前面的字元)在目標對象中的出現模式。 較為常用的元字元包括: “+”, “*”,以及 “?”。其中,“+”元字元規定其前置字元必須在目標對象中連續出現一次或多次,“*”元字元規定其前置字元必須在目標對象中出現零次或連續多次,而“?”元字元規定其前置對象必須在目標對象中連續出現零次或一次。 下面,就讓我們來看一下Regex元字元的具體應用。 /fo+/ 因為上述Regex中包含“+”元字元,表示可以與目標對象中的 “fool”, “fo”, 或者 “football”等在字母f後面連續出現一個或多個字母o的字串相匹配。 /eg*/ 因為上述Regex中包含“*”元字元,表示可以與目標對象中的 “easy”, “ego”, 或者 “egg”等在字母e後面連續出現零個或多個字母g的字串相匹配。 /Wil?/ 因為上述Regex中包含“?”元字元,表示可以與目標對象中的 “Win”, 或者 “Wilson”,等在字母i後面連續出現零個或一個字母l的字串相匹配。 除了元字元之外,使用者還可以精確指定模式在匹配對象中出現的頻率。例如, /jim{2,6}/ 上述Regex規定字元m可以在匹配對象中連續出現2-6次,因此,上述Regex可以同jimmy或jimmmmmy等字串相匹配。 在對如何使用Regex有了初步瞭解之後,我們來看一下其它幾個重要的元字元的使用方式。 /s:用於匹配單個空格符,包括tab鍵和分行符號; /S:用於匹配除單個空格符之外的所有字元; /d:用於匹配從0到9的數字; /w:用於匹配字母,數字或底線; /W:用於匹配所有與/w不匹配的字元; . :用於匹配除分行符號之外的所有字元。 (說明:我們可以把/s和/S以及/w和/W看作互為逆運算) 下面,我們就通過執行個體看一下如何在Regex中使用上述元字元。 //s+/ 上述Regex可以用於匹配目標對象中的一個或多個空白字元。 //d000/ 如果我們手中有一份複雜的財務報表,那麼我們可以通過上述Regex輕而易舉尋找到所有總額達千元的款項。 除了我們以上所介紹的元字元之外,Regex中還具有另外一種較為獨特的專用字元,即定位器。定位器用於規定匹配模式在目標對象中的出現位置。 較為常用的定位器包括: “^”, “$”, “/b” 以及 “/B”。其中,“^”定位器規定匹配模式必須出現在目標字串的開頭,“$”定位器規定匹配模式必須出現在目標對象的結尾,/b定位器規定匹配模式必須 出現在目標字串的開頭或結尾的兩個邊界之一,而“/B”定位器則規定匹配對象必須位於目標字串的開頭和結尾兩個邊界之內,即匹配對象既不能作為目標字 符串的開頭,也不能作為目標字串的結尾。同樣,我們也可以把“^”和“$”以及“/b”和“/B”看作是互為逆運算的兩組定位器。舉例來說: /^hell/ 因為上述Regex中包含“^”定位器,所以可以與目標對象中以 “hell”, “hello”或 “hellhound”開頭的字串相匹配。 /ar$/ 因為上述Regex中包含“$”定位器,所以可以與目標對象中以 “car”, “bar”或 “ar” 結尾的字串相匹配。 //bbom/ 因為上述Regex模式以“/b”定位器開頭,所以可以與目標對象中以 “bomb”, 或 “bom”開頭的字串相匹配。 /man/b/ 因為上述Regex模式以“/b”定位器結尾,所以可以與目標對象中以 “human”, “woman”或 “man”結尾的字串相匹配。 為了能夠方便使用者更加靈活的設定匹配模式,Regex允許使用者在匹配模式中指定某一個範圍而不局限於具體的字元。例如: /[A-Z]/ 上述Regex將會與從A到Z範圍內任何一個大寫字母相匹配。 /[a-z]/ 上述Regex將會與從a到z範圍內任何一個小寫字母相匹配。 /[0-9]/ 上述Regex將會與從0到9範圍內任何一個數字相匹配。 /([a-z][A-Z][0-9])+/ 上述Regex將會與任何由字母和數字組成的字串,如 “aB0” 等相匹配。這裡需要提醒使用者注意的一點就是可以在Regex中使用 “()” 把字串組合在一起。“()”符號包含的內容必須同時出現在目標對象中。因此,上述Regex將無法與諸如 “abc”等的字串匹配,因為“abc”中的最後一個字元為字母而非數字。 如果我們希望在Regex中實作類別似編程邏輯中的“或”運算,在多個不同的模式中任選一個進行匹配的話,可以使用管道符 “|”。例如: /to|too|2/ 上述Regex將會與目標對象中的 “to”, “too”, 或 “2” 相匹配。 Regex中還有一個較為常用的運算子,即否定符 “[^]”。與我們前文所介紹的定位器 “^” 不同,否定符 “[^]”規定目標對象中不能存在模式中所規定的字串。例如: /[^A-C]/ 上述字串將會與目標對象中除A,B,和C之外的任何字元相匹配。一般來說,當“^”出現在 “[]”內時就被視做否定運算子;而當“^”位於“[]”之外,或沒有“[]”時,則應當被視做定位器。 最後,當使用者需要在Regex的模式中加入元字元,並尋找其匹配對象時,可以使用轉義符“/”。例如: /Th/*/ 上述Regex將會與目標對象中的“Th*”而非“The”等相匹配。
sed 命令+Regex