sed操作符舉例
sed操作符舉例
標記法 |
效果 |
8d |
刪除輸入的第8行. |
/^$/d |
刪除所有空行. |
1,/^$/d |
從輸入的開頭一直刪除到第1個空行(第一個空行也刪除掉). |
/Jones/p |
只列印那些包含"Jones"的行(使用-n選項). |
s/Windows/Linux/ |
在每個輸入行中, 將第一個出現的"Windows"執行個體替換為"Linux". |
s/BSOD/stability/g |
在每個輸入行中, 將所有"BSOD"都替換為"stability". |
s/ *$// |
刪除掉每行結尾的所有空格. |
s/00*/0/g |
將所有連續出現的0都壓縮成單個的0. |
/GUI/d |
刪除掉所有包含"GUI"的行. |
s/GUI//g |
將所有"GUI"都刪除掉, 並保持剩餘部分的完整性. |
1、把檔案中所有的空行刪除
#!/bin/bash
sed -e /^$/d "$1" file.txt
=sed -e '/^$/d' file.txt
exit 0
-e:表示後邊跟著的是"編輯"命令(可選) edit
^:表示行首
$:表示行尾
d:刪除命令 delete
"$1":將命令列參數引用起來,表示可以在檔案名稱中使用空白字元或特殊字元
2、將一個檔案中的某個字串(或匹配模式), 替換為另一個字串(或匹配模式)
sed -e "s/$old_pattern/$new_pattern/g" $file_name
s: substitution替換
"g", 即全域標誌, 用來自動替換掉每行中
3、寫記錄檔
echo "`date` + `whoami` + $OPERATION "$@"" >> $file_name
$OPERATION: 在操作執行之前, 記錄到記錄檔中
4、列印ASCII碼的字元表
#!/bin/bash
# pr-ascii.sh: 列印ASCII碼的字元表.
START=33 # 可列印的ASCII字元的範圍(十進位).
END=125
echo " Decimal Hex Character" # 表頭.
echo " ------- --- ---------"
for ((i=START; i<=END; i++))
do
echo $i | awk '{printf(" %3d %2x %c/n", $1, $1, $1)}'
# 在這種上下文中, 不會運行Bash內建的printf命令:
# printf "%c" "$i"
done
exit 0
1、# 將原來的所有空行刪除並在每一行後面增加一空行。
# 這樣在輸出的文本中每一行後面將有且只有一空行。
sed '/^$/d;G'
2、#刪除所有偶數行
sed 'n;d'
3、# 在匹配式樣“regex”的行之前和之後各插入一空行
sed '/regex/{x;p;x;G;}'
4、# 在匹配式樣“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 '$='
# 只在行中出現字串“baz”的情況下將“foo”替換成“bar”
sed '/baz/s/foo/bar/g'
# 將“foo”替換成“bar”,並且只在行中未出現字串“baz”的情況下替換
sed '/baz/!s/foo/bar/g'
其它
1、將myfile.txt中所有內容abc -> ABC
sed -e 's/abc/ABC/g' myfile.txt:
sed -e 's:/abc:ABC:g' myfile.txt
2、指定行數內進行此操作:
sed -e '1,10s/abc/ABC/g' myfile.txt
只在第一到第十行(包括這兩行)
3、 <b>This</b> is what <b>I</b> meant.
sed -e 's/<.*>//g' myfile.html ->meant.
sed -e 's/<[^>]*>//g' myfile.html ->This is what I meant.
'[^>]' 指定“非 '>'”字元,其後的 '*' 完成該運算式以表示“零或多個非 '>' 字元”。
4、[a-z] [A-Z]
5、假設您正在回複一條訊息。下例將在每一行前面加上短語 "ralph said: ":
sed -e 's/.*/ralph said: &/' origmsg.txt
輸出如下:
ralph said: Hiya Jim, ralph said: ralph said:
I sure like this sed stuff! ralph said:
6、刪除以#開頭的內容
sed -e /^#/d myfile.txt
輸出檔案中的 main() 函數
sed -n -e '/main[[:space:]]*(/,/^}/p' file.txt
sed -n -e '/main[ -V]*(/,/^}/p' file.txt
反轉行
sed -e '1!G;h;$!d' forward.txt > backward.txt
解釋:
'G' 命令將只應用第一行。然而,還有一個 '!' 字元 -- 該 '!' 字元 忽略該地址,即,'G' 命令將應用到除第一行之外的 所有行。
如果命令是 '$d',則將只把 'd' 命令應用到檔案中的最後一行('$' 地址是指定最後一行的簡單方式)。然而,有了 '!' 之後,'$!d' 將把 'd' 命令應用到除最後一行之外的 所有行。
7、基於 DOS/Windows 的文字檔在每一行末尾有一個 CR(斷行符號)和 LF(換行),而 UNIX 文本只有一個換行。
UNIX 文本移至 Windows 系統
sed -e 's/$//r/' myunix.txt > mydos.txt
DOS/Windows 格式的文本轉換成可信賴的UNIX 格式
sed -e 's/.$//' mydos.txt > myunix.txt
10、指令碼語言:
change.sh: sed -e 's//(.*/) /(.*/) /(.*/)/Victor /1-/2 Von /3/' myfile.txt
myfile.txt: foo bar oni eeny meeny miny larry curly moe jimmy the weasel
執行: ./change.sh
輸出: Victor foo bar oni eeny meeny miny larry curly moe jimmy the weasel- Von
引用:
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/wrapper.html#EX3
http://sed.sourceforge.net/sed1line_zh-CN.html
http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-1/