Linux命令:sed命令高級用法詳解
作者:管理員 來源:互聯網 發布時間:2025-12-23 10:10:42 點擊數:0
sed(Stream EDitor)是Linux中一個功能強大的流式文本編輯器,它按行處理文本,非常適合文本替換、刪除、插入和轉換等任務。sed是一種流編輯器,它是文本處理中非常強大的工具,能夠完美的配合正則表達式使用,用法簡單實用,非常靈活。
一、基本語法和工作原理
sed [選項] '命令' 文件 sed [選項] -f 腳本文件 文件
工作原理:
讀取文件的一行到模式空間(臨時緩沖區)
執行sed命令處理模式空間的內容
將處理后的內容輸出到標準輸出
重復直到文件結束
二、常用選項
| 選項 | 說明 |
|---|---|
-n | 靜默模式,只顯示處理過的行 |
-e | 允許多個命令串聯 |
-f | 從腳本文件讀取命令 |
-i | 直接修改源文件(危險但實用) |
-r | 使用擴展正則表達式 |
三、核心命令詳解
1. 替換命令(最常用)
# 基本格式 s/pattern/replacement/flags # 示例 sed 's/old/new/' file.txt # 每行第一個old替換為new sed 's/old/new/g' file.txt # 全局替換 sed 's/old/new/2' file.txt # 每行第二個old替換 sed 's/old/new/ig' file.txt # 忽略大小寫并全局替換 sed 's|/usr/bin|/usr/local/bin|' # 使用不同分隔符
2. 刪除命令
sed '3d' file.txt # 刪除第3行 sed '1,5d' file.txt # 刪除1-5行 sed '/pattern/d' file.txt # 刪除匹配行 sed '/start/,/end/d' # 刪除start到end之間的行 sed '$d' file.txt # 刪除最后一行
3. 插入和追加
sed '3i\插入的內容' file.txt # 在第3行前插入 sed '3a\追加的內容' file.txt # 在第3行后追加 sed '/pattern/i\插入' file.txt # 在匹配行前插入 sed '/pattern/a\追加' file.txt # 在匹配行后追加
4. 打印命令
sed -n '3p' file.txt # 只打印第3行 sed -n '1,5p' file.txt # 打印1-5行 sed -n '/pattern/p' file.txt # 打印匹配行 sed -n '3,5!p' file.txt # 打印除了3-5行的內容
5. 替換行內容
sed '3c\新行內容' file.txt # 替換第3行 sed '/pattern/c\新內容' file.txt # 替換匹配行
四、高級功能
1. 地址范圍
sed '10,20s/old/new/g' # 只在10-20行替換 sed '/start/,/end/s/old/new/g' # 在匹配范圍替換 sed '5,$s/old/new/g' # 從第5行到文件末尾
2. 多點編輯
# 多個命令用分號分隔 sed -e 's/old/new/g' -e '/foo/d' file.txt # 或者 sed 's/old/new/g; /foo/d' file.txt
3. 分組和反向引用
# 使用括號分組,\1、\2引用 sed 's/\([0-9]*\)-\([0-9]*\)/\2:\1/' # 123-456 → 456:123 sed -r 's/([0-9]*)-([0-9]*)/\2:\1/' # 擴展正則寫法
4. 保持空間和模式空間
g # 用保持空間內容替換模式空間 G # 將保持空間內容追加到模式空間 h # 用模式空間內容替換保持空間 H # 將模式空間內容追加到保持空間 x # 交換兩個空間的內容
五、實用示例
1. 文件操作
# 原地修改文件(先備份) sed -i.bak 's/old/new/g' file.txt # 刪除空行 sed '/^$/d' file.txt # 刪除注釋行和空行 sed -e '/^#/d' -e '/^$/d' file.conf # 每行行首添加內容 sed 's/^/# /' file.txt # 每行行尾添加內容 sed 's/$/ --- end/' file.txt
2. 數據處理
# 提取特定行 sed -n '5,10p' data.txt > output.txt # 替換CSV文件中的分隔符 sed 's/,/|/g' data.csv # 格式化文本 sed 's/^ *//' file.txt # 刪除行首空格 sed 's/ *$//' file.txt # 刪除行尾空格
3. 日志處理
# 提取時間范圍內的日志 sed -n '/2024-01-01 10:00:00/,/2024-01-01 11:00:00/p' app.log # 刪除包含敏感信息的行 sed '/password/d;/secret/d' log.txt
4. Shell腳本結合
# 在腳本中使用變量 old="foo" new="bar" sed "s/$old/$new/g" file.txt # 處理命令輸出 ps aux | sed '/grep/d' | sed 's/ */ /g'
六、注意事項和技巧
1.特殊字符轉義
# 替換包含斜杠的字符串 sed 's/\/path\/to\/old/\/new\/path/g' # 繁瑣 sed 's|/path/to/old|/new/path|g' # 更好 # 替換包含分隔符的字符串 sed 's|/usr/local/bin|/opt/bin|g'
2. 性能優化
# 1. 使用地址限制操作范圍 sed '1,1000s/old/new/g' # 只在1-1000行操作 # 2. 合并多個命令 sed -e 's/old/new/g' -e '/pattern/d' # 優于多次調用sed # 3. 避免不必要的正則表達式 sed 's/old/new/' # 簡單字符串時不需要正則
3. 調試技巧
# 1. 先測試不使用-i sed 's/old/new/g' file.txt > test.txt # 2. 使用l命令查看特殊字符 sed -n '1,5l' file.txt # 3. 逐步添加復雜表達式 sed 's/pattern/replace/' # 先測試基礎 sed 's/pattern/replace/g' # 添加全局標志 sed -r 's/(group)/replace/g' # 添加正則分組
七、常見問題解決
1.處理大文件
# 使用地址范圍分塊處理 sed -i '1,50000s/old/new/g' bigfile.txt sed -i '50001,100000s/old/new/g' bigfile.txt
2. 跨行匹配(sed的局限性)
# sed默認不支持跨行匹配,可用以下技巧: sed ':a;N;$!ba;s/\n/ /g' # 將多行合并為一行
3. 備份策略
# 總是先備份 cp file.txt file.txt.bak sed -i 's/old/new/g' file.txt # 或者使用sed的備份功能 sed -i.bak 's/old/new/g' file.txt
sed雖然強大,但語法有些晦澀。建議:
復雜操作先用簡單文件測試
重要文件操作前一定備份
對于特別復雜的文本處理,考慮awk或Perl
將常用sed命令保存為腳本或別名
上一篇:在IIS上配置X-Forwarded-For防護
下一篇:Linux命令:ipconfig與ifconfig命令用法及區別
相關內容:
