寫(xiě)在前面
本篇是個(gè)人學(xué)習(xí)整理筆記而得掸冤。
原書(shū):Sed and Awk 101 Hacks -中文版
引用書(shū)結(jié)尾的一句話:
Knowledge is not one man’s Entity
sed 基本使用
1. 項(xiàng)目列表 執(zhí)行多條指令
sed -n -e'/^root/p' -e'/^nobody/p' /etc/passwd
sed -n '{/^root/p/^nobody/p}' /etc/passwd
2. sed的執(zhí)行流程
Sed 腳本執(zhí)行遵從下面簡(jiǎn)單易記的順序:Read,Execute,Print,Repeat(讀取箩绍,執(zhí)行,打印,重復(fù))洋满,簡(jiǎn)稱(chēng) REPR
分析腳本執(zhí)行順序:
- 讀取一行到模式空間(sed 內(nèi)部的一個(gè)臨時(shí)緩存孝赫,用于存放讀取到的內(nèi)容)。
- 在模式空間中執(zhí)行命令几迄。如果使用了{(lán) } 或 --e 指定了多個(gè)命令蔚龙,sed 將依次執(zhí)行每個(gè)命令。
- 打印模式空間的內(nèi)容映胁,然后清空模式空間木羹。
- 重復(fù)上述過(guò)程,直到文件結(jié)束解孙。
3. 打印模式空間
### 打印所有
sed -n 'p' employee.txt
### 打印指定一行
sed -n '2 p' employee.txt
### 打印指定幾行
sed -n '1,3 p' employee.txt
### 打印指定行到結(jié)尾
sed -n '4,$ p' employee.txt
4. 刪除行
用法和打印行基本一致坑填,匹配需要?jiǎng)h除的行,使用刪除命令 "d"
### 刪除所有空行
sed '/^$/d' employee.txt
### 刪除所有注釋行(假定注釋行以#開(kāi)頭)
sed '/^#/d' employee.txt
### 注意:如果有多個(gè)命令弛姜,sed 遇到命令 d 時(shí)脐瑰,會(huì)刪除匹配到的整行數(shù)據(jù),其余的命令將無(wú)法操作被刪除的行娱据。
5. 模式空間輸出到文件
用法和打印行基本一致蚪黑,匹配需要?jiǎng)h除的行盅惜,使用刪除命令 "w"
### 將 2-3 行輸出到 output.tmp 文件
sed -n '2,3 w output.tmp' employee.txt
6. 替換
### 替換所有行
sed 's/Manager/Diractor/' employee.txt
### 替換匹配到Sales的行
sed '/Sales/s/Manager/Diractor/' employee.txt
### 默認(rèn)情況下,sed會(huì)替換一行中第一次匹配到的字符串
sed 's/a/A/' employee.txt
### 使用全局標(biāo)志g忌穿,可以替換所有出現(xiàn)的字符串
sed 's/a/A/g' employee.txt
### 使用數(shù)字標(biāo)志抒寂,可以只替換每行第n次字符串的出現(xiàn)
sed 's/a/A/2' employee.txt
### 打印標(biāo)志p,配合-n s一起使用掠剑,只顯示被替換的行
sed -n 's/locate/find/2 p' sl-test.txt
### 替換后寫(xiě)標(biāo)志w
sed 's/locate/find/2 w output.tmp' sl-test.txt
### 忽略大小寫(xiě)標(biāo)志i
sed -n 's/john/Johnny/i p' employee.txt
### 執(zhí)行命令標(biāo)志e
# 可以將模式空間的內(nèi)容作為shell命令執(zhí)行彬返回結(jié)果到模式空間
cat files.txt
/etc/passwd
/etc/group
sed 's/^/ls -l /e' files.txt
-rw-r--r--. 1 root root 1775 6月 12 16:39 /etc/passwd
-rw-r--r--. 1 root root 873 6月 12 16:39 /etc/group
### 標(biāo)志組合
sed -n 's/manager/Director/igpw output.tmp' employee.txt
### 替換模式的分隔符
# 可以使用任意的字符作為sed替換命令的分界符
sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt
# 等價(jià)于
sed 's@/usr/local/bin@/usr/bin@' path.txt
sed 's!/usr/local/bin!/usr/bin!' path.txt
### & 的作用——獲取匹配到模式
sed 's/^[0-9][0-9][0-9]/[&]/' employee.txt
### 分組以 \( 開(kāi)始屈芜,以 \) 結(jié)束單個(gè)分組:
sed 's/\([^,]*\).*/\1/g' employee.txt
### 上面例子中:
# 正則表達(dá)式\([^,]*\)匹配字符串從開(kāi)頭到第一個(gè)逗號(hào)之間的所有字符(并將其放入第一個(gè)分組中)
# replacement-string 中的\1 將替代匹配到的分組
# g 即是全局標(biāo)志
### 分組替換(多個(gè)分組)
sed 's/^\([^,]*\),\([^,]*\),\([^,]*\)/\1,\3/' employee.txt
### 使用 sed 可以把 DOS 的換行符(CR/LF)替換為 Unix 格式。當(dāng)把 DOS 格式的文件拷到 Unix 上朴译,你會(huì)發(fā)現(xiàn)井佑,每行結(jié)尾都有\(zhòng)r\n .
# 使用 sed 把 DOS 格式的文件轉(zhuǎn)換為 Unix 格式:
sed 's/.$//' filename
7. sed腳本
### 可以重復(fù)使用一組sed語(yǔ)句
cat run.sed
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g
s/^.*/<&>/
s/Developer/IT Manager/
s/Manager/Director/
sed -f run.sed employee.txt
<John Doe,101, CEO>
<Jason Smith,102, IT Director>
<Raj Reddy,103, Sysadmin>
<Anand Ram,104, IT Director>
<Jane Miller,105, Sales Director>
### 用做命令解釋器
cat run.sed
#!/bin/sed -f
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1,\3/g
s/^.*/<&>/
s/Developer/IT Manager/
s/Manager/Director/
./run.sed employee.txt
<John Doe,101, CEO>
<Jason Smith,102, IT Director>
<Raj Reddy,103, Sysadmin>
<Anand Ram,104, IT Director>
<Jane Miller,105, Sales Director>
### 屏蔽默認(rèn)輸出-nf
cat test.sed
#!/bin/sed -nf
/root/p
/nobody/p
/mail/p
/mail/p
8. 修改文件
### 常用重定向和w命令
sed 's/John/Johnny/' employee.txt > new-employee.txt
sed 's/John/Johnny/w new-employee.txt' employee.txt
### 使用-i命令,會(huì)直接修改原文件# 可以使用{-i + 擴(kuò)展名}來(lái)備份原文件
sed -i.bak 's/John/Johnny/' employee.txt
### 上邊語(yǔ)句等價(jià)于-i的全名–in-place
sed –in-place=.bak 's/John/Johnny/' employee.txt