sed s y命令比較

 函數參數 s 表示替換(substitute)文件內字串。其指令格式如下 :

[address1[ ,address2]] s/pattern/replacemen/[flag]
說明:
函數參數 s 最多與兩個位址參數配合。
pattern: 它爲 reguler expression 字串。它表示文件中要被替換的字串。

replacement: 它爲一般字串。但其內出現下列字元有特別意義 :
& : 代表其前 pattern 字串。例如
sed -e 's/test/& my car/' test.txt
指令中 , & 代表 pattern字符串 "
test";故執行後 , 文件中的第一個出現的 "test" 被替換成 "test my car"。
\n : 代表 pattern 中被第 n 個 \( 、\) 所括起來的字串。例如
sed -e 's/\(test\)\(my\)\(car\)/[\2 \3 \1]/' test.txt
指令中 , \1 表示 "test"、\2 表示 "my"、\1 表示 "car" 字串。故執行後 , 文件中的 "test my car" 被替換 成 "[my car test]"。
\ : 可用它來還原一些特殊符號(如上述的 & 與 \ )本身字面上的意義 , 或用它來代表換行 sed -e 's/hu\\a/zhou/g' test.txt就把hu\a替換成了zhou。
flag : 主要用它來控制一些替換情況 :
當 flag 爲 g 時 , 代表替換所有符合(match)的字串 。
當 flag 爲十進位數字 m 時 , 代表替換行內第 m 個符合的字串。
當 flag 爲 p 時 , 代表替換第一個符合 pattern 的字串後 , 將該行再在原始行下面再輸出一次。
當 flag 爲 w wfile 時 , 代表替換第一個符合 pattern 的字串後 , 輸出到 wfile 檔內(如果 wfile 不存在 , 則會 重新開啓名爲 wfile 的檔案)。
例:
題目 : 替換 input.dat 檔內 "1996" 字串成 "1997" , 同時
將這些資料行存入 year97.dat 檔內。
說明 : 用函數參數 s 指示 sed 將 "1996" 字串替換成 "1997" , 另外用 s argument 中的 flag w 指示 sed 將替換
過的資料行存入 year97.dat 檔內。
sed 命令列:
sed -e 's/1996/1997/w year97.dat' input.dat  
當沒有 flag 時 , 則將資料行內第一個符合 pattern 的字串以 replacement 字串來替換 。
delimiter標誌字符(一般使用/) : 在 "/pattern/replace/[flag] " 中 "/" 被當成一 delimiter。除了空白(blank)、換行(newline) 之外 , 使用者可用任何字元作爲 delimiter。例如下述編輯指令
s#/usr#/usr1#g
上述命令中 delimiter爲#。如果用 "/" 做 delimiter , 則 sed 會將 pattern 與 replacement 中的 "/" 當成 delimiter 而發生錯誤。

address範圍
sed -e '/find/s/replaced/replace/g' input.dat 意思是將輸入文件中包含find字符串的行中的replaced替換成replace;
sed -e '/find1/,/find2/s/replaced/replace/g' input.dat
sed -e '1s/replaced/replace/g' input.dat 意思是將輸入文件中第1行中的replaced替換成replace;
sed -e '1,3s/replaced/replace/g' input.dat
sed -e '1,/find2/s/replaced/replace/g' input.dat
sed -e '/find1/,1s/replaced/replace/g' input.dat

結合正則表達式:
 echo Tolstoy writes well | sed 's/Tolstoy/Camus/' 
結果爲 Camus writes well;
 echo Tolstoy is worldly | sed 's/T.*y/Camus/'
結果爲Camus,因爲T.*y一直從第一個開始的T到最後一個y;
echo Tolstoy is worldly | sed 's/T[[:alpha:]]*y/Camus/'
結果爲Camus writes well;
echo abc | sed 's/b*/1/'  替換第一個b*爲1,結果問哦1abc;
echo abc | sed 's/b*/1/g'   替換是有的b*爲1,結果問哦1a1bc1;

函數參數 y表示轉換資料中的字元。其指令格式如下 :
sed -e '[address1[ ,address2]]y /xyz.../abc.../' input
對於上述格式有下面幾點說明 :
函數參數最多配合兩個位址參數。
指令中 , /abc.../xyz.../(x、y、z、a、b、c 代表某些字元) 爲 y 的 argument 。其中 abc... 與 xyz... 的字元個數 必須相同。
sed 執行轉換時 , 將 pattern space 內資料內的 a 字符轉換成 x 字符 、b字符轉換成 y 字符 、c 字符轉換成 z字符 ...,替換是一一對應的關係,不在替換內容中的字符不會被替換。
例:
題目: 將 input.dat 檔中的小寫字母改成大寫。假設 input.dat 檔的內容如下 :
Sodd's Second Law:
Sooner or later, the worst possible set of
circumstances is bound to occur.
說明:利用函數參數 y 指示 sed 做字母大小的轉換。
sed 命令列如下 :
sed -e ' y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ ' input.dat
執行上述命令輸出結果如下 :
SODD'S SECOND LAW:
SOONER OR LATER, THE WORST POSSIBLE SET OF
CIRCUMSTANCES IS BOUND TO OCCUR.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章