sed命令筆記250419
sed
(Stream Editor)是 Linux/Unix 系統中強大的流編輯器,主要用于對文本進行過濾和轉換(按行處理)。它支持正則表達式,適合處理文本替換、刪除、插入等操作。以下是 sed
的詳細解析:
一、基本語法
sed [選項] '命令' 輸入文件
sed [選項] -f 腳本文件 輸入文件 # 從腳本文件讀取命令
二、常見選項
選項 | 說明 |
---|---|
-n | 靜默模式,僅輸出處理后的行(常與 p 命令搭配) |
-e | 指定多個命令,如 sed -e '命令1' -e '命令2' |
-i | 直接修改文件內容(慎用,建議先備份)-i.bak 修改前備份原文件為 .bak |
-E , -r, --regexp-extended | 使用擴展正則表達式(如 + , | , () 等) |
-f | 從指定文件中讀取命令 |
三、編輯命令(核心)
1. 替換命令 s
s/pattern/replacement/flags
- flags 常用值:
g
:全局替換(默認每行僅替換第一個匹配)p
:替換后打印行(需與-n
選項配合)i
:忽略大小寫數字
:替換第 N 個匹配
- 示例:
echo "hello world" | sed 's/hello/hi/' # 輸出 hi world echo "a a a" | sed 's/a/b/2' # 替換第二個a:a b a
2. 刪除命令 d
sed '地址定界d' 文件 # 刪除匹配行
sed '3d' file # 刪除第3行
sed '/^$/d' file # 刪除所有空行
3. 插入/追加行
命令 | 說明 |
---|---|
i\ | 在行前插入內容(如 sed '2i\插入內容' file ) |
a\ | 在行后追加內容(如 sed '2a\追加內容' file ) |
4. 其他命令
命令 | 說明 |
---|---|
p | 打印行(常與 -n 配合:sed -n '1p' file 打印第1行) |
= | 顯示行號(如 sed '=' file ) |
y | 字符轉換(如 sed 'y/abc/ABC/' 將a→A, b→B, c→C) |
r | 讀取文件并插入(如 sed '/pattern/r otherfile' file ) |
w | 將匹配行寫入文件(如 sed '/pattern/w output.txt' file ) |
四、地址定界(指定操作范圍)
格式 | 說明 |
---|---|
n | 第 n 行(如 sed '3s/a/b/' 修改第3行) |
n,m | 第 n 到 m 行(如 1,5d 刪除1-5行) |
$ | 最后一行 |
/pattern/ | 匹配正則的行(如 /^#/d 刪除注釋行) |
n,+m | 從第n行到其后m行(如 2,+3 表示2-5行) |
! | 取反(如 3!d 刪除除第3行外的所有行) |
五、替換命令 s
的進階用法
1. 分組與反向引用
sed
命令中的分組(Grouping)是正則表達式的重要功能,通過 ()
將部分模式標記為一個整體,并可通過反向引用在替換操作中重用這些分組內容。
echo "123-456" | sed -r 's/([0-9]+)-([0-9]+)/\2-\1/' # 輸出 456-123
()
分組,\1
,\2
引用分組。 從\1
開始, 第一個是\1
- ??
sed
不支持(?:)
語法,所有()
均為捕獲分組。
用sed替換文本 筆記250419
sed的分組替換,捕獲組,反向引用 筆記250419
2. 特殊字符轉義
若替換內容包含 /
,可更換分隔符(如 s|/old|/new|
)。
3. 動態替換
使用 &
引用匹配的整個內容:
echo "123" | sed 's/[0-9]\+/數字:&/' # 輸出 數字:123
分組詳解
sed的分組替換,捕獲組,反向引用 筆記250419
sed
命令中的分組(Grouping)是正則表達式的重要功能,通過 ()
將部分模式標記為一個整體,并可通過反向引用在替換操作中重用這些分組內容。
?? sed
不支持 (?:)
語法,所有 ()
均為捕獲分組。
一、分組的基本語法
1. 創建分組
使用 \(
和 \)
包裹正則表達式(基礎正則語法):
echo "abc123" | sed 's/\([a-z]\+\)[0-9]\+/\1/' # 輸出 abc
# 解析:
# - \([a-z]\+\) 匹配字母部分,并標記為分組1
# - \1 反向引用分組1的內容
2. 擴展正則表達式
若使用 -r
(GNU sed)或 -E
(macOS),可省略轉義符:
echo "abc123" | sed -r 's/([a-z]+)[0-9]+/\1/' # 輸出 abc(更簡潔)
二、分組的核心用途
1. 提取并重組內容
# 將日期格式從 "YYYY-MM-DD" 改為 "DD/MM/YYYY"
echo "2023-10-05" | sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# 輸出:05/10/2023
# 分組1: 2023, 分組2: 10, 分組3: 05
2. 保留部分原始內容
# 在匹配的單詞兩側添加方括號
echo "hello world" | sed -r 's/(\b\w+\b)/[\1]/g'
# 輸出:[hello] [world]
3. 動態調整順序
# 交換 "key: value" 為 "value: key"
echo "name: John" | sed -r 's/([^:]+):\s*(.+)/\2: \1/'
# 輸出:John: name
三、高級分組技巧
1. 多級分組(嵌套分組)
分組按左括號順序編號,從外到內、從左到右:
echo "12-34-56" | sed -r 's/(([0-9]{2})-){2}([0-9]{2})/\1\3/'
# 輸出:12-3456
# 分組1: 12-34-, 分組2: 34, 分組3: 56
用sed替換文本 筆記250419
sed的分組替換,捕獲組,反向引用 筆記250419
2. 與替換標志結合
結合 g
(全局)或 i
(忽略大小寫)等標志:
# 將所有重復的單詞合并(如 "hello hello" → "hello")
echo "hello hello world" | sed -r 's/\b(\w+)\b \1/\1/g'
# 輸出:hello world
3. 非捕獲分組(sed不支持)
?? sed
不支持 (?:)
非捕獲分組語法,所有 ()
均為捕獲分組。
四、分組在地址定界中的應用
分組也可用于匹配行的條件判斷:
# 刪除包含重復單詞的行(如 "apple apple")
sed -r '/\b(\w+)\b \1/d' file.txt
六. 示例場景
1. 替換文件內容
sed -i 's/foo/bar/g' file.txt # 將所有foo替換為bar(直接修改文件)
sed -i.bak 's/old/new/' file.txt # 修改前備份原文件為file.txt.bak
2. 刪除操作
sed '/^#/d' file.conf # 刪除所有注釋行(以#開頭)
sed '/^$/d; /^$/d' file # 刪除連續空行(保留單個空行需更復雜處理)
3. 處理指定行
sed '2,5s/yes/no/' file # 將2-5行的yes替換為no
sed '$a\This is the end' file # 在最后一行后追加內容
4. 多重命令
sed -e 's/foo/bar/' -e '/baz/d' file
sed 's/a/A/; s/b/B/' file # 多個命令用分號分隔
1. 處理日志文件
# 提取日志中的 IP 和訪問路徑(假設格式:IP - [時間] "GET /path HTTP/1.1")
cat access.log | sed -r 's/([0-9.]+).*"GET (\/[^ ]+).*/\1 \2/'
# 輸出:192.168.1.1 /index.html
2. 格式化配置文件
# 將 "key=value" 改為 "key = value"
sed -r 's/([^=]+)=/\1 = /' config.ini
3. 處理 CSV 數據
# 交換 CSV 前兩列(假設分隔符為逗號)
echo "apple,123,fruit" | sed -r 's/([^,]+),([^,]+)/\2,\1/'
# 輸出:123,apple,fruit
七、注意事項
-
-i
選項風險:直接修改原文件,建議先不加-i
測試命令。 -
正則兼容性:默認支持基礎正則,使用
-r
或-E
啟用擴展正則。 -
行處理機制:
sed
逐行處理,適合大文件,但復雜操作可能不如awk
靈活。 -
轉義括號:在基礎正則中需用
\(
和\)
,擴展正則(-r
或-E
)可直接用()
。 -
分組數量:最多支持 9 個分組(
\1
到\9
)。 -
性能:復雜分組可能降低處理速度,尤其在大型文件中。
用sed替換文本 筆記250419
sed的分組替換,捕獲組,反向引用 筆記250419
1?? 參考 1
sed
(Stream Editor)是 Linux/Unix 中強大的流式文本處理工具,主要用于對文本進行替換、刪除、插入等操作。以下是 sed
的詳細用法:
基本語法
sed [選項] '命令' 輸入文件
sed [選項] -f 腳本文件 輸入文件
常用選項
選項 | 作用 |
---|---|
-n | 僅輸出處理后的行(默認會輸出所有行) |
-i | 直接修改文件內容(謹慎使用,建議先備份) |
-e | 指定多個命令(例如 sed -e '命令1' -e '命令2' ) |
-f | 從腳本文件讀取命令 |
-E , -r, --regexp-extended | 使用擴展正則表達式(簡化語法) |
常用命令
1. 替換文本:s
sed 's/原內容/替換內容/[標志]'
- 標志:
g
:全局替換(默認只替換每行第一個匹配項)p
:打印替換后的行(常與-n
選項一起使用)i
:忽略大小寫(需配合-r
或-E
使用擴展正則)
示例:
sed 's/apple/orange/g' file.txt # 替換所有 apple 為 orange
sed -n 's/foo/bar/p' file.txt # 僅打印發生替換的行
sed -i 's/old/new/' file.txt # 直接修改文件
sed 's|/usr/bin|/usr/local/bin|g' # 使用 | 替代 / 作為分隔符
2. 刪除行:d
sed '地址定界符 d' 文件
示例:
sed '3d' file.txt # 刪除第3行
sed '/pattern/d' file.txt # 刪除匹配 pattern 的行
sed '1,5d' file.txt # 刪除1-5行
sed '/^$/d' file.txt # 刪除所有空行
3. 插入/追加行:i
和 a
i
:在指定行前插入a
:在指定行后追加
示例:
sed '2i Insert this line' file.txt # 在第2行前插入一行
sed '/pattern/a Append this line' # 在匹配行后追加一行
4. 替換指定行號
sed '2s/old/new/' file.txt # 替換第2行的第一個 old 為 new
sed '1,5s/old/new/g' file.txt # 替換1-5行的所有 old 為 new
5. 地址定界(指定操作范圍)
- 行號:
sed '3,5命令'
(操作第3-5行) - 正則匹配:
sed '/pattern/命令'
(操作匹配pattern
的行)
示例:
sed '/start/,/end/d' file.txt # 刪除從 start 到 end 的所有行
sed '/^#/d' file.txt # 刪除所有注釋行(以 # 開頭)
高級用法
1. 多命令執行
sed -e 's/foo/bar/' -e '/pattern/d' file.txt
# 或
sed 's/foo/bar/; /pattern/d' file.txt
2. 保持空間(Hold Space)
h
:將模式空間內容復制到保持空間H
:將模式空間內容追加到保持空間g
:將保持空間內容復制到模式空間G
:將保持空間內容追加到模式空間
示例(反轉文件行序):
sed -n '1!G;h;$p' file.txt
3. 文件操作
sed 'r 文件2' 文件1 # 將文件2的內容插入到文件1的每行后
sed '/pattern/w 新文件' file.txt # 將匹配的行寫入新文件
4. 轉換字符:y
sed 'y/abc/XYZ/' file.txt # 將 a→X, b→Y, c→Z(類似 tr 命令)
常見使用場景
-
批量替換文件內容:
sed -i 's/old/new/g' *.txt
-
刪除空行或注釋行:
sed -i '/^$/d; /^#/d' file.conf
-
提取特定內容:
sed -n '/error/p' log.txt > errors.log
-
行號處理:
sed = file.txt | sed 'N; s/\n/ /' # 顯示行號(類似 nl)
-
批量修改配置:
sed -i '/^Port /s/22/2222/' /etc/ssh/sshd_config # 修改SSH端口
注意事項
-i
選項會直接修改文件,建議先不加-i
測試命令。- 正則表達式中的特殊字符(如
*
,$
,^
)需要轉義。 - macOS 的
sed
與 Linux 存在差異(如-i
必須帶參數:sed -i '' ...
)。
通過靈活組合上述命令,可以高效處理文本任務!
2?? 參考 2
sed命令詳解
一、sed是什么?
sed(Stream Editor) 是 Linux 和類 Unix 系統中的流式文本編輯器,用于對文本進行高效處理和轉換。它逐行讀取文件,通過命令對文本進行增刪改查操作,支持正則表達式,適合處理大量文本數據。
二、核心語法結構
sed [選項] '命令' 輸入文件
- 常用選項:
-n
:安靜模式(不自動打印所有行,需配合p
命令顯式輸出)。-i
:直接修改文件內容(慎用,建議先不加-i
測試)。-e
:執行多個命令(如sed -e 's/a/b/' -e 's/c/d/' file
)。-f
:從腳本文件讀取命令(sed -f script.sed file
)。
三、基礎命令與示例
1. 打印文本
- 打印第2行:
sed -n '2p' file.txt
- 打印第1-3行:
sed -n '1,3p' file.txt
- 打印包含"error"的行:
sed -n '/error/p' file.txt
2. 替換文本
- 替換每行第一個匹配項:
sed 's/old/new/' file.txt
- 全局替換(所有匹配項):
sed 's/old/new/g' file.txt
- 替換第3行的內容:
sed '3s/old/new/' file.txt
3. 刪除文本
- 刪除第3行:
sed '3d' file.txt
- 刪除空行:
sed '/^$/d' file.txt
- 刪除包含"error"的行:
sed '/error/d' file.txt
4. 插入/追加文本
- 在第2行前插入文本:
sed '2i\Insert this line' file.txt
- 在第2行后追加文本:
sed '2a\Append this line' file.txt
四、高級功能
1. 多行處理命令
- 合并下一行到模式空間:
sed 'N' file.txt # 合并兩行(如處理跨行日志)
- 刪除多行組中的單行:
sed 'D' file.txt # 刪除模式空間的第一行
- 打印多行組中的單行:
sed -n 'P' file.txt # 打印模式空間的第一行
2. 模式空間與保持空間
- 復制模式空間到保持空間:
sed 'h' file.txt # h命令
- 將保持空間內容覆蓋模式空間:
sed 'g' file.txt # g命令
- 示例:交換兩行內容:
echo -e "line1\nline2\nline3" | sed -n '1h;2x;p' # 輸出:line2(原第1行和第2行交換)
3. 分支與循環
- 條件分支:
sed '/pattern/b label' file.txt # 匹配pattern則跳轉到label
- 循環替換:
echo "This, is, a, test" | sed -n ':start; s/,//1p; t start' # 輸出:This is a test(逐步刪除逗號)
4. 正則表達式增強
- 子字符串匹配:
echo "System Administrator" | sed 's/\(System\) Administrator/\1 User/' # 輸出:System User(\1引用第一個括號內容)
- 擴展正則表達式(使用
-r
或-E
):sed -r 's/(http|https)://\1/g' file.txt # 提取URL協議
五、實用技巧
- 批量修改文件:
sed -i 's/舊域名/新域名/g' *.html # 修改所有HTML文件中的域名
- 提取特定行:
sed -n '10,20p' data.log # 輸出第10-20行
- 刪除空行和注釋:
sed -r '/^$|^#/d' config.conf # 刪除空行和以#開頭的行
- 復雜替換:
sed 's/old/new/2' file.txt # 僅替換每行第二個匹配項
六、總結
- 適用場景:日志處理、配置文件修改、批量文本替換、數據分析預處理。
- 注意事項:
- 使用
-i
前務必備份文件。 - 正則表達式中的特殊字符(如
/
、*
)需轉義。 - 多命令執行時,用分號或
-e
分隔命令。
- 使用
掌握sed
可顯著提升文本處理效率,建議通過實際案例練習鞏固。
3?? 參考 3
以下是關于 sed
命令的詳細解析,涵蓋其基本用法、核心命令、選項、高級功能及實際示例:
1. 什么是 sed
?
- 全稱:Stream Editor(流編輯器)。
- 功能:對文本流進行編輯,支持正則表達式,常用于文本處理、替換、刪除、插入等操作。
- 特點:
- 非交互式處理,適合腳本自動化。
- 處理時將文本暫存到“模式空間”(Pattern Space)中,處理后再輸出。
2. 基本語法
sed [選項] '命令' 文件
sed [選項] -f 腳本文件 文件
- 常用選項:
-n
:抑制默認輸出(僅打印處理后的行)。-i
:直接修改原文件(可加后綴備份,如-i.bak
)。-f 腳本文件
:從文件中讀取sed
命令。-e
:在命令行中執行多個命令。
3. 核心命令
(1) 替換(s
命令)
- 語法:
s/舊字符串/新字符串/標志
- 標志:
g
:全局替換(替換所有匹配項,默認僅替換第一個)。p
:替換后打印該行。w 文件
:將替換后的行寫入指定文件。
- 示例:
# 替換文件中所有出現的 "apple" 為 "banana" sed 's/apple/banana/g' file.txt# 直接修改文件并備份 sed -i.bak 's/apple/banana/g' file.txt# 替換每行最后一個匹配項 sed 's/apple/banana/\;' file.txt # 注意:此處 `\;` 表示最后一個匹配項
(2) 刪除(d
命令)
- 語法:
地址 d
- 示例:
# 刪除第3行 sed '3d' file.txt# 刪除包含 "error" 的行 sed '/error/d' file.txt# 刪除第5到第10行 sed '5,10d' file.txt
(3) 打印(p
命令)
- 語法:
地址 p
- 示例:
# 打印第5行(需配合 `-n`) sed -n '5p' file.txt# 打印包含 "warning" 的行 sed -n '/warning/p' file.txt
(4) 插入與追加
- 插入(
i
):在指定行前插入文本。 - 追加(
a
):在指定行后追加文本。 - 示例:
# 在第3行前插入 "New Line" sed '3i\New Line' file.txt# 在匹配 "start" 的行后追加 "Added Text" sed '/start/a\Added Text' file.txt
(5) 行號與模式匹配
- 行號地址:直接指定行號(如
3
表示第3行)。 - 正則表達式:用
/pattern/
匹配行。 - 組合地址:
start,end
或/pattern1/,/pattern2/
。 - 示例:
# 刪除第2到第5行 sed '2,5d' file.txt# 從 "START" 到 "END" 的行全部刪除 sed '/START/,/END/d' file.txt
4. 高級功能
(1) 分支與標簽(b
、t
、:label
)
- 用途:實現條件跳轉或循環。
- 示例:
# 標簽跳轉示例 sed -e ':loop' -e '/pattern/!b end' -e 's/pattern/replacement/' -e 'b loop' -e ':end' file.txt
(2) 緩沖區操作(h
、H
、g
、G
)
- 用途:暫存和恢復文本。
- 命令:
h
:將模式空間內容存入緩沖區。H
:追加模式空間內容到緩沖區。g
:用緩沖區內容替換模式空間。G
:追加緩沖區內容到模式空間。
- 示例:
# 將當前行與下一行合并 sed -e 'N; s/\n/ /' file.txt
(3) 擴展正則表達式
- 支持:
sed
支持正則表達式匹配,如^
(行首)、$
(行尾)、.*
(任意字符)等。 - 示例:
# 刪除以 "#" 開頭的行 sed '/^#/d' file.txt# 替換行尾的數字 sed 's/[0-9]$//g' file.txt
5. 實際應用示例
示例1:替換字符串并修改文件
# 將文件中的 "old" 替換為 "new",并備份原文件
sed -i.bak 's/old/new/g' config.txt
示例2:刪除特定行
# 刪除包含 "error" 的行,并輸出結果到新文件
sed '/error/d' log.txt > cleaned_log.txt
示例3:插入文本
# 在文件開頭插入 "Header Line"
sed '1i\Header Line' file.txt
示例4:結合正則表達式
# 將所有以數字開頭的行替換為空行
sed '/^[0-9]/s/.*/ /' data.txt
示例5:多命令組合
# 刪除第5行,替換第10行的 "text" 為 "new"
sed '5d;10s/text/new/' example.txt
6. 注意事項
- 默認行為:
sed
默認輸出所有行,修改僅在內存中臨時生效,需用-i
保存。 - 特殊字符轉義:若替換內容包含
/
、&
等,需轉義或更換分隔符(如s|old|new|
)。 - 多行處理:用
N
命令將下一行加入模式空間,實現多行操作。
7. 總結
sed
是 Linux 下強大的文本處理工具,適用于:
- 快速替換、刪除、插入文本。
- 結合正則表達式進行復雜匹配。
- 腳本自動化文本處理任務(如日志清理、配置文件修改)。
通過靈活組合命令和選項,可以高效完成各種文本編輯需求。
4?? 參考 4
sed 命令詳解
sed
(Stream Editor,流編輯器)是 Unix/Linux 下強大的文本處理工具,用于對文本流(文件或標準輸入)進行過濾和轉換。它逐行讀取輸入,根據指定的腳本對每行數據進行處理,最終輸出處理結果。
一、基本語法
sed [選項] '腳本命令' 輸入文件
或
sed [選項] -f 腳本文件 輸入文件
二、常用選項
選項 | 說明 |
---|---|
-n | 取消默認輸出(僅輸出被腳本處理的行)。 |
-e | 執行指定的腳本命令(可省略,直接跟單引號腳本)。 |
-f file | 從文件中讀取腳本命令。 |
-i | 直接修改輸入文件(危險!建議先備份,可通過 -i.bak 生成備份)。 |
-r | 使用擴展正則表達式(默認使用基本正則表達式)。 |
-s | 分隔多個文件時,視為獨立文件處理(不合并成一個流)。 |
-v | 顯示版本信息。 |
三、核心工作流程
sed
從輸入中讀取一行數據,存入模式空間(Pattern Space)。- 對模式空間中的內容應用腳本中的所有命令。
- 處理完成后,默認將模式空間的內容輸出到標準輸出(可通過
-n
禁用)。 - 清空模式空間,讀取下一行,重復上述過程。
四、常用命令(按功能分類)
1. 替換命令 s
語法:
s/舊字符串/新字符串/[修飾符]
- 修飾符:
g
:全局替換(替換行中所有匹配項,而非第一個)。數字
:替換第n
個匹配項(如s/old/new/2
替換第二個匹配項)。i
:不區分大小寫(僅在擴展正則中有效,或配合-r
使用)。
示例:
- 替換每行第一個
apple
為banana
:sed 's/apple/banana/' file.txt
- 全局替換所有
apple
為banana
:sed 's/apple/banana/g' file.txt
- 替換以
http://
開頭的字符串為https://
(正則匹配):sed 's/^http:/https:/' file.txt
- 使用其他分隔符(避免轉義斜杠):
sed 's#http://#https://#' file.txt # 用 # 代替 / 作為分隔符
2. 刪除命令 d
語法:
地址范圍d # 省略地址則匹配所有行
示例:
- 刪除包含
error
的行:sed '/error/d' file.txt
- 刪除第 5 行:
sed '5d' file.txt
- 刪除空行:
sed '/^$/d' file.txt # 或 sed -e '/^\s*$/d' 處理包含空格的空行
3. 插入與附加命令 i
、a
i
(插入):在匹配行的上方插入新行。a
(附加):在匹配行的下方插入新行。
語法:
地址范圍i\
新行內容
地址范圍a\
新行內容
示例:
- 在包含
header
的行上方插入# Start
:sed '/header/i\# Start' file.txt
- 在文件末尾添加一行
EOF
:sed '$a\EOF' file.txt # $ 表示最后一行
4. 修改命令 c
語法:
地址范圍c\
新內容
功能:將匹配行替換為指定的新內容。
示例:
- 將第 3 行替換為
new line
:sed '3c\new line' file.txt
5. 打印命令 p
語法:
地址范圍p
功能:打印匹配行(需配合 -n
選項避免默認輸出)。
示例:
- 僅打印包含
success
的行:sed -n '/success/p' file.txt
- 打印第 2 到第 5 行:
sed -n '2,5p' file.txt
6. 保留空間命令 h
、H
、g
、G
h
:將模式空間內容復制到保留空間(覆蓋保留空間)。H
:將模式空間內容追加到保留空間。g
:將保留空間內容復制到模式空間(覆蓋模式空間)。G
:將保留空間內容追加到模式空間。
示例:交換兩行內容(需配合地址范圍):
sed -n '1h; 2G; p' file.txt # 第1行存入保留空間,第2行追加保留空間內容并打印
7. 其他實用命令
=
: 打印行號。sed '=' file.txt # 輸出每行內容及其行號(行號先于內容)
q
: 退出sed(遇到匹配行時終止處理)。sed '/target/q' file.txt # 遇到包含target的行時停止處理
s///
簡寫:替換為空(刪除匹配內容)。sed 's/old//' file.txt # 刪除第一個old sed 's/old//g' file.txt # 刪除所有old
五、地址范圍
sed 命令可針對特定行或匹配模式的行執行,地址范圍語法如下:
語法 | 說明 |
---|---|
n | 第 n 行(如 5 表示第5行)。 |
n,m | 第 n 行到第 m 行(如 2,10 )。 |
/pattern/ | 匹配包含 pattern 的行(如 /error/ )。 |
/pattern1/,/pattern2/ | 從匹配 pattern1 的行到匹配 pattern2 的行(包含這兩行)。 |
$ | 最后一行。 |
0 | 不匹配任何行(無意義)。 |
示例:
- 對第 3 到第 5 行執行刪除:
sed '3,5d' file.txt
- 對包含
start
到包含end
的行之間的內容執行替換:sed '/start/,/end/s/old/new/g' file.txt
六、正則表達式注意事項
-
基本正則 vs 擴展正則:
- 默認使用基本正則表達式(BRE),特殊字符需轉義(如
\.
表示點號,\( \)
表示分組)。 - 使用
-r
選項啟用擴展正則表達式(ERE),無需轉義部分字符(如\.
可寫成\.
或\.
,()
直接分組)。
- 默認使用基本正則表達式(BRE),特殊字符需轉義(如
-
常用正則符號:
^
:行首,$
:行尾。.*
:匹配任意字符(除換行符)零次或多次。[abc]
:匹配a、b、c中的任意一個。\(text\)
(BRE)或(text)
(ERE):分組,可通過\1
引用第一個分組。
示例(分組引用):
- 交換
a=123 b=456
中的值:sed 's/\(a=\)\(.*\) \(b=\)\(.*\)/\3\4 \1\2/' # 基本正則,需轉義括號 sed -r 's/(a=)(.*) (b=)(.*)/\3\4 \1\2/' # 擴展正則,無需轉義括號
七、典型應用場景
- 替換文件中的字符串(謹慎使用
-i
):sed -i 's/old_string/new_string/g' file.txt
- 刪除注釋或空行:
sed -e '/^#/d' -e '/^$/d' config.conf # 刪除以#開頭的注釋行和空行
- 提取日志中的特定信息:
logfile | sed -n '/ERROR/p' # 僅輸出包含ERROR的行
- 修改配置文件:
sed -i '/^user=/c\user=admin' config.ini # 修改user配置項
- 處理 CSV/日志格式:
sed 's/,/ /g' data.csv # 將逗號替換為空格
八、注意事項
- 備份文件:使用
-i
前務必確認,或通過-i.bak
生成備份:sed -i.bak 's/old/new/g' file.txt # 生成file.txt.bak備份
- 特殊字符轉義:在替換內容中若包含
$
、/
、&
等字符,需用\
轉義,或使用其他分隔符(如#
)。 - 多行處理:sed 默認逐行處理,若需處理多行,可結合
N
(將下一行追加到模式空間)、D
(刪除模式空間中直到第一個換行符的內容)等命令,但邏輯較復雜,建議改用awk
或perl
。
九、總結
sed
是文本處理的瑞士軍刀,核心在于靈活運用地址范圍和替換/刪除/插入等命令,結合正則表達式實現高效的文本轉換。掌握基礎命令后,通過實踐可應對復雜場景(如日志清洗、配置文件修改等)。建議先通過 man sed
查閱完整文檔,或使用在線工具(如 RegExr)調試正則表達式。
5?? 參考 5
sed
是流編輯器(Stream Editor)的簡稱,是一種強大的文本處理工具,能在 Linux 系統中對文本進行各種操作,如替換、刪除、插入等。以下是對它的詳細講解:
基本語法
sed [選項]... {script}... [輸入文件]...
sed [選項]... --file=scriptfile [輸入文件]...
其中,選項常見的有:
-e script
:表示使用腳本script
來處理輸入的文件。-f scriptfile
:表示使用腳本文件scriptfile
中的指令來處理輸入的文件。-n
:只打印腳本處理后的結果,否則sed
會默認輸出所有行。-i
:直接修改文件內容,而不是輸出到終端。
常見命令及操作
- 替換(s) :格式為
s/查找內容/替換內容/選項
。例如,將文件中所有的 “apple” 替換為 “banana”,可以使用sed 's/apple/banana/g' filename
。“g” 表示全局替換,如果不加 “g”,則每行只替換第一個匹配的 “apple”。 - 刪除(d) :用于刪除指定的行。例如,刪除文件的第 3 行,使用
sed '3d' filename
;刪除文件中包含 “error” 的行,使用sed '/error/d' filename
。 - 插入(i 和 a) :
i
表示在指定行之前插入,a
表示在指定行之后插入。例如,在文件的第 2 行之前插入 “hello world”,使用sed '2i hello world' filename
;在文件的第 4 行之后插入 “test”,使用sed '4a test' filename
。 - 打印(p) :用于打印指定的行。例如,打印文件的第 5 行,使用
sed -n '5p' filename
;打印文件中包含 “success” 的行,使用sed -n '/success/p' filename
。
地址范圍
地址范圍可以指定要進行操作的行范圍,格式為 [地址范圍]操作
。例如:
sed '1,5d' filename
:刪除文件的第 1 到第 5 行。sed '/start/,/end/s/old/new/g' filename
:從包含 “start” 的行到包含 “end” 的行之間,將所有的 “old” 替換為 “new”。
其他功能
-
多行操作 :可以用
\
將命令分多行書寫,提高可讀性。例如:- `sed -e ‘1,5d’ \
-e ‘/error/d’ filename`
-
腳本文件 :可以將多個
sed
命令寫入一個腳本文件,然后使用-f
選項來執行。例如,創建一個腳本文件script.sed
,內容為:1,5d
/error/d
然后使用 sed -f script.sed filename
來執行。
- 結合其他命令 :可以和其他命令結合使用,如
grep
、awk
等,實現更復雜的數據處理。例如,先用grep
找出包含 “info” 的行,再用sed
替換其中的某些內容:grep 'info' filename | sed 's/old/new/g'
6?? 參考 6
sed
(全稱:stream editor
,即流編輯器)是一種在Unix、Linux和其他類Unix系統中常用的命令行文本處理工具。它可以對文本文件進行查找、替換、刪除和插入等操作,非常適合用于批量文本處理任務。
基本語法
sed [選項] '命令' 輸入文件
常用選項
-n
:禁止自動打印模式空間,只有當命令明確要求輸出時才打印。-e
:允許在命令行上添加多個編輯命令。-f
:從指定的文件中讀取編輯命令。-i
:直接修改輸入文件,而不是將結果輸出到標準輸出。
常用命令
p
:打印當前模式空間的內容。d
:刪除當前模式空間的內容。s/old/new/
:將當前模式空間中的“old”字符串替換為“new”字符串。i\
:在當前行之前插入文本。a\
:在當前行之后追加文本。c\
:將選定的行改為新的指定的文本。y/old/new/
:將當前模式空間中的字符“old”替換為“new”。
示例
- 打印文件中的所有行:
sed '' 文件名
- 打印文件中的第2行:
sed -n '2p' 文件名
- 刪除文件中的第2行:
sed '2d' 文件名
- 將文件中的所有“old”替換為“new”:
sed 's/old/new/g' 文件名
- 在文件中的每行前面添加“prefix-”:
sed 's/^/prefix-/' 文件名
- 直接修改文件,將所有“old”替換為“new”:
sed -i 's/old/new/g' 文件名
這只是sed
命令的一些基本用法,實際上sed
的功能非常強大,可以通過組合多個命令和選項來完成更復雜的文本處理任務。
sed
命令詳解
sed
(Stream Editor)是Linux/Unix系統中用于文本處理的流式編輯器,支持對文本進行查找、替換、刪除、插入等操作[1][2][6]。以下是其核心功能和用法的詳細解析:
一、基本語法
sed [選項] '命令' [輸入文件]
- 選項:控制
sed
的行為(如直接修改文件、多命令執行等)。 - 命令:指定操作類型(如替換、刪除、插入等)。
- 輸入文件:可選,若省略則從標準輸入讀取數據[4][6]。
二、常用選項
選項 | 作用 |
---|---|
-i | 直接修改原文件(而非輸出到終端)[2][5]。 |
-e | 執行多個命令(可重復使用),例如 -e 's/old/new/' -e 'd' [2][6]。 |
-n | 禁止默認輸出,僅顯示經過處理的行(需配合p 命令使用)[4][6]。 |
三、核心命令與操作
-
替換(Substitution)
語法:s/模式/替換內容/
- 將匹配“模式”的文本替換為“替換內容”。
- 示例:將文件
file.txt
中的foo
替換為bar
:sed 's/foo/bar/g' file.txt # `g`表示全局替換[^2^][^5^]
-
刪除(Delete)
語法:d
- 刪除當前行。
- 示例:刪除第3行:
sed '3d' file.txt # 或指定行范圍,如`3,5d`刪除3-5行[^3^][^5^]
-
插入(Insert)
語法:i\
后接內容- 在當前行上方插入內容。
- 示例:在第2行前插入
New Line
:sed '2i\New Line' file.txt # 使用`a\`表示在行下方插入[^3^][^5^]
-
打印(Print)
語法:p
- 輸出緩沖區中的文本。常與
-n
選項配合使用。 - 示例:僅打印包含
error
的行:sed -n '/error/p' file.txt # `/pattern/p`表示匹配行才打印[^4^][^6^]
- 輸出緩沖區中的文本。常與
-
定界符與多命令
- 若命令中包含
/
,可通過更改定界符避免沖突,例如s:/old/:/new/:g
。 - 多命令用
-e
或分號分隔,例如:sed -e 's/foo/bar/' -e '3d' file.txt # 先替換,再刪除第3行[^2^][^6^]
- 若命令中包含
四、高級功能
-
正則表達式支持
sed
支持基礎正則表達式,例如^
(行首)、$
(行尾)、.
(任意字符)等。- 示例:刪除空行:
sed '/^$/d' file.txt # 匹配空行并刪除[^3^][^5^]
-
分組與引用
- 使用
\1
,\2
等引用括號分組內容。 - 示例:將
Chapter 1
改為Section 1
:sed 's/\(Chapter \)[0-9]+\1/Section \1/' file.txt # 替換分組內容[^5^]
- 使用
-
腳本文件與復雜操作
- 將多條命令寫入腳本文件(如
commands.sed
),通過sed -f commands.sed file.txt
執行。 - 示例:批量替換多個單詞:
s/foo/bar/g s/test/demo/g
- 將多條命令寫入腳本文件(如
五、應用場景
-
批量文本處理
- 快速修改配置文件、日志文件或代碼中的特定內容[1][4]。
- 示例:批量替換代碼中的變量名:
sed -i 's/oldVar/newVar/g' *.c # 修改所有`.c`文件中的變量名[^2^][^5^]
-
數據清洗
- 刪除多余空行、提取特定字段或格式化文本[3][6]。
-
腳本自動化
- 結合Shell腳本實現復雜文本處理流程,例如日志分析或數據預處理[5]。
六、注意事項
- 備份原文件
- 使用
-i
選項時,建議先備份文件(如cp file.txt file.bak
),避免誤操作[4]。
- 使用
- 區分
sed
與awk
sed
擅長簡單文本替換和刪除,而awk
更適合基于條件的復雜文本處理[1][6]。
- 性能優化
- 對大文件處理時,優先使用流式處理(如
sed 's/pattern/replace/g' largefile
),避免加載整個文件到內存[4]。
- 對大文件處理時,優先使用流式處理(如
通過靈活組合選項和命令,sed
可高效解決多種文本處理需求。更多細節可參考man sed
或查看具體系統的幫助文檔[3][6]。
7?? 參考 7
sed命令詳解與使用指南
sed(Stream Editor)是Linux/Unix系統中的流式文本編輯器,通過模式匹配+文本操作實現非交互式文本處理。其核心優勢在于逐行處理能力和正則表達式支持。
一、基礎語法結構
sed [選項] '操作指令' 輸入文件
典型示例:
sed 's/foo/bar/g' file.txt # 全局替換foo為bar
sed -i.bak '3d' config.cfg # 刪除第3行并創建備份文件
二、核心功能模塊
-
常用選項(OPTIONS)
選項 功能說明 -n
抑制默認輸出,常與 p
命令配合使用-i[SUFFIX]
直接修改源文件(謹慎使用),可選備份后綴 -r
啟用擴展正則表達式 -e
執行多條命令,如 sed -e 's/a/b/' -e '3d'
-
核心命令(COMMANDS)
命令 格式示例 功能 替換 `s/pattern/replacement/[g p 刪除 d
刪除匹配行,如 sed '/error/d' log.txt
打印 p
輸出指定內容,需配合 -n
選項追加 a\text
在匹配行后追加文本 插入 i\text
在匹配行前插入文本 -
地址匹配規則
sed '3s/old/new/' file # 僅在第3行替換 sed '/start/,/end/d' file # 刪除start到end之間的所有行 sed '5,$p' file # 打印第5行到末尾
三、高級應用技巧
- 多命令組合
sed -e 's/foo/bar/; 5d' file.txt # 替換后刪除第5行
- 正則表達式擴展
sed -r 's/(\d+)-(\d+)/\2:\1/' phone.txt # 用分組重組電話號碼
- 腳本文件調用
sed -f script.sed input.txt # 調用預存命令腳本
四、安全操作建議
- 測試命令時先省略
-i
選項,確認無誤后再執行真實修改 - 使用
-i.bak
創建備份文件,防止誤操作 - 復雜正則表達式建議先用
echo | sed
驗證
五、典型應用場景
- 日志清洗:
sed '/ERROR/d; s/DEBUG/INFO/' app.log
- 配置文件修改:
sed -i '/^#Port/s/#Port/Port/' sshd_config
- 數據格式轉換:
sed 's/\(.*\)/\U\1/' names.txt
(轉大寫)
8?? 參考 8
sed
(Stream Editor)是Linux/Unix系統中強大的流式文本處理工具,支持非交互式的批量編輯操作。以下從核心功能、語法結構、實戰案例等方面進行詳解:
一、核心功能與原理
-
流式處理機制
sed逐行讀取輸入(文件或標準輸入流),將當前行存入模式空間(Pattern Space),按腳本命令處理后輸出,再清空緩沖區進入下一循環。默認不修改原文件,僅輸出到終端,需通過-i
選項直接編輯文件。 -
主要功能
? 替換文本:如批量修改字符串? 刪除/插入行:根據行號或正則匹配操作
? 過濾與提取:打印特定行或匹配內容
? 復雜腳本處理:支持分支、循環等高級操作
二、基礎語法與常用命令
sed [選項] '操作指令' 輸入文件
常用選項
選項 | 說明 |
---|---|
-n | 禁止默認輸出,常與p 命令配合顯示指定內容 |
-e | 執行多條命令(例:sed -e 's/a/b/' -e 'd' ) |
-i | 直接修改原文件(危險操作,建議備份) |
-r | 啟用擴展正則表達式 |
核心操作指令
命令 | 功能 | 示例 |
---|---|---|
s/replace/new/ | 替換首個匹配內容 | sed 's/old/new/g' (全局替換) |
d | 刪除行 | sed '3d' (刪第3行) |
a\text | 行后追加文本 | sed '/pattern/a\new line' |
i\text | 行前插入文本 | sed '2i\header' (第2行前插入) |
p | 打印內容 | sed -n '1,5p' (僅顯示1-5行) |
三、地址定位與正則表達式
-
地址范圍
? 行號:3,5
(第3到5行)? 正則匹配:
/^start/,/end$/
(匹配以start
開頭到end
結尾的行)? 特殊符號:
$
表示末行,1~2
表示從第1行開始每隔2行處理 -
正則元字符
符號 含義 ^
行首錨定(例: /^#/
匹配注釋行)$
行尾錨定(例: /txt$/
匹配以txt結尾的行).*
任意字符(貪婪匹配) \<
單詞開頭(例: /\<word
匹配以word開頭的單詞)
四、實戰案例
-
批量替換域名
sed -i 's/www.old.com/www.new.com/g' *.conf # 替換所有.conf文件中的舊域名
-
刪除注釋行與空行
sed -i '/^#/d; /^$/d' script.sh # 刪除以#開頭的行和空行
-
插入版權信息
sed '1i\/* Copyright 2025 */' code.c # 在文件首行插入版權聲明
-
提取特定范圍內容
sed -n '/START/,/END/p' data.log # 打印START到END之間的內容
五、高級技巧
-
多點編輯
使用-e
執行多個命令,或分號分隔:sed -e '1,5d' -e 's/error/warning/' log.txt # 先刪除1-5行,再替換error
-
引用匹配內容
在替換中使用&
引用匹配項,或\1
引用分組:sed 's/[0-9]/&th/g' # 將數字后加th(如2→2th) sed 's/\(love\)able/\1rs/' # loveable→lovers
-
模式空間與保持空間
通過h
(復制到緩沖區)、G
(追加到模式空間)實現跨行操作。
總結
sed通過簡潔的腳本語法實現高效文本處理,尤其適合自動化場景。掌握基礎命令后,可結合正則表達式和地址定位處理復雜需求。更高級的標簽跳轉、條件分支等功能可參考官方文檔或進階教程。
9?? 參考 9
sed
(Stream Editor)是一個強大的文本處理工具,廣泛用于在類Unix操作系統中進行文本替換、刪除、插入和搜索等操作。以下是sed
命令的詳細解釋:
基本語法
sed [選項] '命令' 文件
常用選項
-n
:抑制自動打印模式空間內容,通常與p
命令一起使用以僅輸出特定行。-e
:指定要執行的命令,可以多次使用。-f
:從文件中讀取sed
命令。-i
:直接修改文件內容(就地編輯)。
基本命令
-
替換(Substitution)
sed 's/模式/替換內容/' 文件
s
:表示替換操作。/模式/
:要匹配的模式。/替換內容/
:用于替換的內容。- 默認情況下,
sed
只替換每行中第一次匹配的內容。
示例:將每行中的
foo
替換為bar
。sed 's/foo/bar/' 文件
-
刪除(Delete)
sed 'Nd' 文件
N
:要刪除的行號。d
:刪除命令。
示例:刪除第3行。
sed '3d' 文件
-
插入和追加(Insert & Append)
-
插入(Insert):在指定行之前插入內容。
sed 'Ni\新內容' 文件
i\
:插入命令。
-
追加(Append):在指定行之后追加內容。
sed 'Na\新內容' 文件
a\
:追加命令。
示例:在第2行之前插入
新行
。sed '2i\新行' 文件
-
-
打印特定行(Print)
sed -n 'Np' 文件
-n
:抑制自動打印。p
:打印命令。
示例:僅打印第5行。
sed -n '5p' 文件
-
范圍操作(Range)
sed '起始行,結束行命令' 文件
示例:替換第2到第4行中的
foo
為bar
。sed '2,4s/foo/bar/' 文件
-
多命令執行
使用
-e
選項可以在一行中執行多個sed
命令。示例:先刪除第1行,然后在第3行插入
新行
。sed -e '1d' -e '3i\新行' 文件
高級用法
-
使用正則表達式
sed
支持使用正則表達式進行復雜的模式匹配和替換。示例:刪除所有以
#
開頭的行。sed '/^#/d' 文件
-
保持和交換(Hold and Exchange)
sed
提供了保持空間(hold space)和模式空間(pattern space)的交換操作,用于更復雜的文本處理。示例:交換每兩行。
sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' 文件
-
使用變量
可以結合Shell變量進行動態替換。
示例:將
foo
替換為變量VAR
的值。VAR="bar" sed "s/foo/$VAR/" 文件
常用示例
-
替換文件中所有
old
為new
并保存結果到新文件sed 's/old/new/g' 文件 > 新文件
-
刪除空行
sed '/^$/d' 文件
-
在文件末尾追加內容
sed '$a\追加的內容' 文件
-
在匹配行之前插入內容
sed '/匹配模式/i\插入的內容' 文件
-
將替換結果直接應用于文件(謹慎使用)
sed -i 's/old/new/g' 文件
注意事項
-
備份文件:在使用
-i
選項進行就地編輯時,建議使用備份選項以防止數據丟失。sed -i.bak 's/old/new/g' 文件
這將在修改文件之前創建一個名為
文件.bak
的備份。 -
轉義字符:在使用特殊字符(如
/
、&
等)時,需要進行適當的轉義。sed 's/\/old\//\/new\//g' 文件
-
性能考慮:對于非常大的文件,
sed
可能會消耗較多內存和處理時間,需根據實際情況選擇合適的工具。
總結
sed
是一個功能強大的文本處理工具,適用于各種文本替換、刪除、插入和搜索任務。掌握其基本命令和高級用法,可以極大地提高文本處理的效率和效果。建議通過實際練習和資料來深入理解sed
的使用方法。
🔟 參考 10
以下是關于 sed
命令的詳細解析,結合其核心功能、語法及實戰應用場景整理而成:
一、sed 基礎概念
sed(Stream Editor)是 Linux/Unix 系統中強大的流編輯器,用于對文本流進行非交互式編輯。其核心流程為:
- 讀取一行到模式空間(Pattern Space);
- 執行命令(如替換、刪除、插入等);
- 輸出結果(默認打印修改后的行);
- 循環處理下一行,直至文件末尾。
二、基本語法
sed [選項] '命令' 輸入文件
- 常用選項:
-n
:禁止默認輸出,僅顯示處理后的行。-e
:允許多條命令執行(命令順序影響結果)。-i
:直接修改原文件(慎用,建議備份:-i.bak
)。-r
:支持擴展正則表達式。
三、核心命令與操作
1. 地址范圍
- 單行:
1
(第1行)、$
(最后一行)。 - 行區間:
1,5
(第1-5行)、5,$
(第5行到最后)。 - 正則匹配:
/pattern/
(匹配含pattern
的行)、\cpatternc
(轉義字符匹配)。
2. 常用命令
命令 | 功能 | 示例 |
---|---|---|
s | 替換文本 | s/old/new/g (全局替換) |
d | 刪除行 | /pattern/d (刪除含 pattern 的行) |
*i* | 插入文本 | /pattern/i\插入內容 (匹配行前插入) |
*a* | 追加文本 | /pattern/a\追加內容 (匹配行后追加) |
p | 打印行 | -n '/pattern/p' (僅打印匹配行) |
*c* | 替換整行 | 2,5c\新內容 (替換第2-5行為新內容) |
3. 高級命令
- 保持與獲取緩沖區:
h
:將當前行復制到保持緩沖區。H
:追加到保持緩沖區。g
:用保持緩沖區內容覆蓋模式空間。G
:追加保持緩沖區內容到模式空間。
- 分支命令:
b label
:跳轉到標簽處執行。t label
:條件滿足時跳轉。
四、替換操作詳解
1. 基本替換
sed 's/apple/orange/g' file.txt # 全局替換所有 "apple" 為 "orange"
- 標志:
g
:全局替換(默認僅替換每行第一個匹配項)。p
:打印替換后的行(常與-n
配合)。w file
:將結果寫入文件。
2. 特殊替換
- 引用匹配內容:
s/\(pattern\)/\1/g
:用捕獲組內容替換(如s/\(love\)/\1able/g
→lovable
)。&
:在替換文本中引用完整匹配項(如s/foo/&bar/g
→foobar
)。
- 字符轉換:
y/abc/XYZ/
:逐字符替換(a→X
,b→Y
,c→Z
)。
五、實戰應用案例
1. 批量替換
sed -i 's/www.old.com/www.new.com/g' *.html # 批量替換所有 HTML 文件中的域名
2. 刪除注釋行
sed '/^#/d' config.sh # 刪除以 # 開頭的注釋行
3. 添加版權信息
sed -i '1i\/*\n * Copyright 2024 *\n */' *.c # 在所有 C 文件開頭插入版權聲明
4. 提取特定列
sed -n '2p' data.txt # 打印第2行
sed -n '/start/,/end/p' file # 打印 start 到 end 之間的行
六、選項與注意事項
- 直接修改文件:使用
-i
選項時,建議備份原文件(如sed -i.bak 's/old/new/g' file
)。 - 正則表達式:默認使用基礎正則,需用
-r
啟用擴展正則(如+
、?
等元字符)。 - 性能優化:處理大文件時,可結合
--unbuffered
(-u
)選項減少內存占用。
七、總結
sed
通過流式處理和腳本化操作,成為文本處理的利器。掌握其核心命令(如 s
、d
、i
)和地址范圍控制,可高效完成日志過濾、配置修改等任務。對于復雜需求,可結合分支、保持緩沖區等高級功能編寫腳本。