sed是一種支援正規表達式的非交流式編輯器stream editor
sed的常用選項
-n 隻顯示比對處理的行(否則會輸出所有)
-e 執行多個編輯指令時(一般用 ; 代替)
-i 直接在檔案中進行修改,而不是輸出到螢幕
-r 支援擴充正規表達式
-f 從腳本檔案中讀取内容并執行(檔案中的編輯指令每行一個,不用 ; 隔開)
sed的常用編輯指令
p 列印比對行
d 删除指定行
a 在比對行後面追加
i 在比對行前面插入
c 整行替換
r 将檔案的内容讀入
w 将文本寫入檔案
s 字元串替換(比對正規表達式)
sed的p指令示例
sed -n '/模式/p' 輸入檔案
這裡的模式可以是正規表達式也可以是精确字元
模式用/括起,擴充正則要加-r選項
示例:sed -n '$p' /etc/passwd 顯示最後1行
sed -n '3,10!p' /etc/passwd 顯示除了3-10行的内容
df -h |sed -n '/\/$/p' 顯示以/結尾的行
a=/dev/shm
sed -rn "s|$a|yy|; /yy/p" /etc/fstab
sed的d指令示例
删除操作可以根據行号和模式比對進行操作
示例:sed '3,5d' /etc/fstab
sed '/2/d' /etc/fstab
sed -r '/^$|^#/d' /etc/fstab
sed -e '/^$/d' -e '/^#/d' /etc/inittab
sed的a指令示例
追加操作可以根據行号和模式比對進行操作
示例:sed '1a 111111' passwd 在第一行後面追加後面的字元串
sed '/root/a 111111' passwd
sed的i指令示例
插入操作可以根據行号和模式比對進行操作
示例:sed '/defaults/i 111111' fstab
sed的c指令示例
更改整行操作可以根據行号和模式比對進行操作
示例:sed '/id:/c id:5:initdefault:' /etc/inittab 将id:所在行整行替換成後面的字元串
sed的r指令示例
讀入操作可以根據行号和模式比對進行操作
示例:sed '$r /etc/hosts' /etc/fstab 在fstab檔案的末尾後面讀入hosts檔案的内容
sed的s指令文法格式
sed -n [行号或模式]s/查找内容/替換内容/[替換标記] 檔案
替換操作可以根據行号和模式比對進行操作
替換标記有4種:
數字:替換每行的第幾個
g:全局替換,否則隻替換第一個字元串。ng從第n個開始替換
p:顯示被執行替換操作的行和-n合用
w:将執行替換操作的行輸出到指定檔案
i:不區分大小寫
示例:sed -n "1,10s/^#//p" /etc/passwd 将注釋行的#去掉
sed -n "1,10s/$/?/p" /etc/passwd 在每行末尾加上?
sed的s指令可以使用任意分隔符作為定界符
sed -n '/^hello/s|/bin/bash|/sbin/nologin|p' /etc/passwd
sed指令疑難問題
$ sed -ir '/^h+/a 1111' /etc/sysconfig/network
$ cat /etc/sysconfig/network
networking=yes
hostname=yy.sxjy.com
$ ls network
network networking/ networkr network-scripts/
注意:-ir選項不會追加成功,會生成一個-r檔案
$ sed -ri '/^h+/a 1111' /etc/sysconfig/network
1111
注意:-ri選項會追加成功,不會生成另一個檔案 是以要将r選項放在前面
sed指令中包含變量
有變量一定要用""
sed的指令中取反操作 !
sed的指令中&的用法
&用于表示替換指令中的比對模式
echo "i have a fat cat" |sed 's/.at/".at"/g'
i have a ".at" ".at"
$ echo "i have a fat cat" |sed 's/.at/"&"/g'
i have a "fat" "cat"
sed -rn 's/\<[0-9]{3}\>/&0/gp' passwd 将所有3位數字後面加個0
sed的s指令中支援\t\n
sed -n 's/^xixi/\n 1111/p' passwd
sed 's/^abrt.*/&\n/' passwd
sed的指令中标簽的用法
标簽:sed使用圓括号定義替換模式中的部分字元
标簽可以友善在後面引用,每行指令最多使用9個标簽