【網絡運維】Linux 文本處理利器:sed 命令

Linux 文本處理利器:sed 命令

sed 簡介

sed(Stream Editor)是一款非交互式的流編輯器,誕生于 1973–1974 年間的貝爾實驗室,由 McMahon 開發。它專為文本處理而生,功能強大,是 Linux 文本處理常客之一。

(另外兩名常客通常視為 grep命令和 awk命令)

其中,sed 與 awk 并稱 Linux/Unix 兩大文字處理王牌工具,sed 側重于替換,awk 側重于分割與重組

本文將深入探討 sed 命令的使用方法與實用技巧。


sed 工作流程

sed 的工作流程可簡單概括為:

讀取行 → 執行 → 顯示 → 讀取行 → 執行 → 顯示 → ……(重復流程)

在這里插入圖片描述

詳細步驟:

  1. 讀取行:從輸入流(文件、管道、標準輸入)讀取一行存入 pattern space
  2. 執行:按順序對當前行應用 sed 命令。
  3. 顯示:將處理后的數據發送到輸出流,并清空 pattern space
  4. 循環:重復上述過程直到所有輸入處理完畢。

注意事項:

  • pattern space 是內存中的臨時區域,關機或關閉終端后數據丟失。
  • 默認不修改源文件,除非使用 -i 選項。
  • hold space 是另一個內存區域,用于持久化存儲數據,供后續檢索使用。
  • 未指定輸入文件時,sed 從標準輸入讀取數據。

環境準備

[furongwang@shell ~]$ vim test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

sed 命令語法

基本格式:

sed [option] [sed-command] [input-file]

常用選項:

選項說明
-n禁止自動打印模式空間
-e添加要執行的腳本
-f從文件中讀取腳本,腳本中的每一個 sed 命令獨自成一行
-i直接修改源文件(可指定備份后綴)
-r使用擴展正則表達式

示例:

打印文件內容(模擬 cat):
sed '' data.txt(任意文件名)
[furongwang@shell ~]$ cat data.txt 
I am studing sed
I am www.twle.cn
I am a no-work-men
I am so handsome[furongwang@shell ~]$ sed '' data.txt 
I am studing sed
I am www.twle.cn
I am a no-work-men
I am so handsome
從標準輸入讀取:
sed ''# 輸入內容后按 Ctrl+D 結束
[furongwang@shell ~]$ sed ''
# 輸入hello world,并回車
hello world
# 輸出hello world
hello world
# 按ctrl+d推出

行尋址與模式尋址

行尋址語法:

[address1[,address2]]命令

示例:

# 打印第1行
[furongwang@shell ~]$ sed -n '1p' test# 打印第1到3行
[furongwang@shell ~]$ sed -n '1,3p' test# 打印第3行到最后
[furongwang@shell ~]$ sed -n '3,$p' test# 打印第2行及后面2行
[furongwang@shell ~]$ sed -n '2,+2p' test# 每隔2行打印一次
[furongwang@shell ~]$ sed -n '1~2p' test

模式尋址:

# 打印含 "zhang" 的行
[furongwang@shell ~]$ sed -n '/zhang/p' test# 打印從 root 開頭到 mail 開頭的行
[furongwang@shell ~]$ sed -n '/^root/,/^mail/p' test

常用子命令詳解

1. 打印(p / P)

  • p:打印整個模式空間
  • P:打印模式空間的第一行
[furongwang@shell ~]$ sed -n '1p' test          # 打印第1行
[furongwang@shell ~]$ sed -n '1,3p' test        # 打印1~3行

2. 讀取下一行(n / N)

  • n:讀取下一行覆蓋當前行
  • N:追加下一行到當前行(用 \n 連接)
# 打印偶數行
[furongwang@shell ~]$ sed -n 'n;p' test# 合并相鄰兩行
[furongwang@shell ~]$ sed 'N;s/\n/==/' test

3. 替換(s)

# 替換每行第一個 root
[furongwang@shell ~]$ sed 's/root/tankzhang/' test# 替換所有 root
[furongwang@shell ~]$ sed 's/root/tankzhang/g' test# 替換每行第3個 my
[furongwang@shell ~]$ sed 's/my/your/3' test1.txt# 自定義分隔符
[furongwang@shell ~]$ sed 's#root#hello#' test

4. 插入與追加(i / a)

# 在匹配行上方插入
[furongwang@shell ~]$ sed '/root/i====aaaa====' test# 在匹配行下方追加
[furongwang@shell ~]$ sed '/root/a====iiii====' test

5. 刪除(d / D)

  • d:刪除整個模式空間
  • D:刪除模式空間的第一行
# 刪除1~14行
[furongwang@shell ~]$ sed '1,14d' test# 刪除含 false 或 bash 的行
[furongwang@shell ~]$ sed '/\(false\|bash\)/d' test

6. 寫文件(w / W)

# 將 root 開頭的行寫入文件
[furongwang@shell ~]$ sed -n '/^root/w output.txt' test
[furongwang@shell ~]$ cat output.txt
root:x:0:0:root:/root:/bin/bash# 小寫w寫入
[furongwang@shell ~]$ vim scripts 
1{
N
w write.log
}
[furongwang@shell ~]$ sed -n -f scripts test# 小寫w寫入包含模式中所有行
[furongwang@shell ~]$ cat write.log
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false# 大寫W寫入只包含模式中第一行
[furongwang@shell ~]$ vim scripts 
1{
N
W write.log
}
[furongwang@shell ~]$ sed -n -f scripts test
[furongwang@shell ~]$ cat write.log
root:x:0:0:root:/root:/bin/bash

7. 退出(q)

# 處理到第3行退出
[furongwang@shell ~]$ sed '3q' test

8. 取反(!)

# 打印非 root 開頭的行
[furongwang@shell ~]$ sed -n '/^root/!p' test

高級用法

多命令執行:

# 使用分號分隔
[furongwang@shell ~]$ sed '1d;2d;5d' test# 使用 -e 選項
[furongwang@shell ~]$ sed -e '1d' -e '2d' test# 使用腳本文件
[furongwang@shell ~]$ sed -f script.sed test

正則表達式與子串:

# 使用轉義括號
[furongwang@shell ~]$ sed 's/\(root\)/\1user/g' test# 使用 -r 避免轉義
[furongwang@shell ~]$ sed -r 's/(root)/\1user/g' test# 使用 & 代表匹配內容
[furongwang@shell ~]$ sed 's/root/&user/g' test

模式空間與保持空間(g/G/h/H):

命令說明
g用保持空間內容覆蓋模式空間
G將保持空間內容追加到模式空間
h用模式空間內容覆蓋保持空間
H將模式空間內容追加到保持空間
# 每行后加空行
[furongwang@shell ~]$ sed 'G' test# 復制匹配行到文件末尾
[furongwang@shell ~]$ sed -e '/root/h' -e '$G' test

附:sed 命令完整幫助信息

[furongwang@shell ~]$ sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...-n, --quiet, --silentsuppress automatic printing of pattern space-e script, --expression=scriptadd the script to the commands to be executed-f script-file, --file=script-fileadd the contents of script-file to the commands to be executed--follow-symlinksfollow symlinks when processing in place-i[SUFFIX], --in-place[=SUFFIX]edit files in place (makes backup if SUFFIX supplied)-c, --copyuse copy instead of rename when shuffling files in -i mode-b, --binarydoes nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (open files in binary mode (CR+LFs are not treated specially))-l N, --line-length=Nspecify the desired line-wrap length for the `l' command--posixdisable all GNU extensions.-r, --regexp-extendeduse extended regular expressions in the script.-s, --separateconsider files as separate rather than as a single continuouslong stream.-u, --unspaceedload minimal amounts of data from the input files and flushthe output spaces more often-z, --null-dataseparate lines by NUL characters--helpdisplay this help and exit--versionoutput version information and exitIf no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret.  All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
 -n, --quiet, --silent    取消自動打印模式空間-e 腳本, --expression=腳本   添加“腳本”到程序的運行列表-f 腳本文件, --file=腳本文件  添加“腳本文件”到程序的運行列表--follow-symlinks    直接修改文件時跟隨軟鏈接-i[擴展名], --in-place[=擴展名]    直接修改文件(如果指定擴展名就備份文件)-l N, --line-length=N   指定“l”命令的換行期望長度--posix  關閉所有 GNU 擴展-r, --regexp-extended  在腳本中使用擴展正則表達式-s, --separate  將輸入文件視為各個獨立的文件而不是一個長的連續輸入-u, --unspaceed  從輸入文件讀取最少的數據,更頻繁的刷新輸出--help     打印幫助并退出--version  輸出版本信息并退出-a ∶新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)-c ∶取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!-d ∶刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;-i ∶插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)-p ∶列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~-s ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93759.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

week2-[一維數組]出現次數

week2-[一維數組]出現次數 題目描述 給定 NNN 個整數A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN?。請求出這 NNN 個數中出現次數最多的數的出現次數&#xff0c;以及出現次數最少的數的出現次數。 輸入格式 讀入包括 222 行。第一行只有 111 個整數 NNN&#xff0c;表示數…

力扣 hot100 Day79

215. 數組中的第K個最大元素 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 k 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。 class…

C++圍繞音視頻相關的資料都有哪些?如何進行學習

音視頻技術涉及的內容廣泛而深入。我會根據自己的知識給你提供一個系統性的音視頻相關資料梳理&#xff0c;主要分為學習路徑與核心知識、開源項目與實戰、開發者資源以及熱點與趨勢幾個方面&#xff0c;希望能幫助你高效地學習和探索。 先用一個表格來概覽主要的學習方向和資…

AI自動化測試,解決傳統自動化測試中??腳本維護成本高、用例覆蓋不全、缺陷發現滯后??等痛點

AI自動化測試&#xff0c;解決傳統自動化測試中??腳本維護成本高、用例覆蓋不全、缺陷發現滯后??等痛點AI自動化測試通過機器學習&#xff08;ML&#xff09;、自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;等技術&#xff0c;解決了傳統…

Laravel 事件與監聽器

下面是一個完整的用戶注冊事件和監聽器的實現示例&#xff0c;包含事件、監聽器、注冊、觸發等完整流程。一、軟件版本 php: 8.2.20laravel: 11mysql: 8.0.29 二、完整實現過程 1.創建事件 1.1 首先創建用戶注冊事件 php artisan make:event UserRegistered1.2 編輯app/Events/…

前端 React 實現數據懶加載-滾動觸底加載數據

在 React 中使用 Intersection Observer API 實現觸底加載分頁&#xff08;無限滾動&#xff09;1.基本實現思路 在列表底部放置一個 哨兵元素&#xff08;Sentinel&#xff09;&#xff08;如 <div>&#xff09;。使用 IntersectionObserver 監聽該元素是否進入視口&…

MySQL 50 道經典練習題及答案

目錄 一、數據表設計與初始化 1. 數據表結構說明 2. 建表語句 3. 插入測試數據 二、練習題及答案 1. 查詢 "01" 課程比 "02" 課程成績高的學生的信息及課程分數 2. 查詢同時存在 "01" 課程和 "02" 課程的情況 3. 查詢存在 &qu…

電競護航小程序搭建三角洲俱樂部護航派單小程序開發游戲派單系統定制開發

成品系統&#xff0c;可以快速搭建。功能概述&#xff1a;商家入駐、老板點單、快捷發單、自定義發單、發單列表、管事入駐、訂單審核裁決、打手入駐、打手排行榜、邀請排行榜、賬戶充值、余額提現、成為客服等

MYSQL-增刪查改CRUD

目錄 &#x1f33f;前言&#xff1a; &#x1f33f;增-C-Create-新增 &#x1f9ca;單行數據全列插入 &#x1f34b;?&#x1f7e9;語法&#xff1a; &#x1f34b;?&#x1f7e9;演示&#xff1a; &#x1f9ca;指定列插入 &#x1f34b;?&#x1f7e9;語法&#xf…

【Loss學習筆記】Focal loss、QFL、DFL、VFL——目標檢測定位損失函數詳解

文章目錄Focal loss&#xff08;2018 ICCV &#xff0c;RetinaNet&#xff09;1、Focal Loss 提出背景問題一&#xff1a;正負樣本數量不均衡問題問題二&#xff1a;難分類/易分類樣本數量不均衡問題對兩個問題的解決2、正負樣本數量不均衡問題的解決&#xff1a;Focal loss 的…

nertctl使用了解

測試了幾個容器&#xff0c;似乎未對k8s的containerd產生影響&#xff0c;都能訪問 再次測試&#xff0c;containerd發生了重啟&#xff0c;nrtdctl啟動的容器都沒了 #### sealos 創建containerd集群 sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29…

三、k8s 1.29 之 資源清單

一、什么是資源 資源(Resources) 是指集群中可被分配、管理和調度的各種實體,既包括計算、存儲、網絡等基礎設施資源,也包括 K8s 自身定義的 API 對象(如 Pod、Deployment 等)。這些資源是 K8s 調度和管理工作負載的核心基礎。 Kubernetes 中的資源本質上是 “可被操作的…

React中常用的Hook(useEffect、useRef、useMemo、useNavigate、useParams)

React hook1&#xff1a;useEffect 在編程中&#xff0c;副作用是指函數或表達式在執行過程中對外部環境產生影響的行為。例如&#xff1a; 修改外部變量&#xff08;如全局變量、DOM、API 請求、設置定時器等&#xff09; 什么是純函數&#xff1f; // 純函數&#xff1a;輸入…

關聯規則挖掘1:Apriori算法

目錄 一、Apriori算法核心原理 1. 基本概念 2. Apriori性質 二、完整案例計算&#xff08;超市購物數據&#xff09; ?步驟1&#xff1a;按字母序重排每筆交易? ?步驟2&#xff1a;統計頻繁1-項集&#xff08;min_support40%&#xff09;?? ?步驟3&#xff1a;生成…

基于 C++ 線程池的多線程目標檢測后處理系統設計與實現

在實際的智能視頻分析系統中,目標檢測(如 YOLOv5)只是第一步。檢測結果往往需要進行后續處理:畫框、報警、推流、日志記錄等。這些操作如果在檢測主線程中同步執行,會嚴重拖慢整體推理速度。 本文將帶你從零實現一個基于 C++ 模板線程池的異步后處理系統,實現“檢測與后…

Java并發容器詳解

1. JUC并發容器概述 Java集合容器框架主要有四大類別&#xff1a;List、Set、Queue、Map。常見的ArrayList、LinkedList、HashMap等容器都是非線程安全的。 Java提供了同步容器&#xff08;如Vector、Hashtable、SynchronizedList&#xff09;通過synchronized實現同步&#xf…

SpringAI系列---【SpringA集成OllamaI如何先調用向量庫,再把查到的結果一起傳給大模型?】

SpringAI如何先調用向量庫&#xff0c;再把查到的結果一起傳給大模型&#xff1f; 1.引入pom <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></depend…

告別“測試滯后”:AI實時測試工具在敏捷開發中的落地經驗

告別“測試滯后”&#xff1a;AI實時測試工具在敏捷開發中的落地經驗 在敏捷開發的“快速迭代”節奏中&#xff0c;測試環節常常成為“拖后腿”的短板。某互聯網公司的敏捷團隊曾陷入這樣的循環&#xff1a;2周迭代周期中&#xff0c;開發用10天完成功能&#xff0c;留給測試的…

K8S-Pod資源對象

一、K8S架構與組件1、K8S架構k8s 總體架構采用了經典的 maste/slave 架構模式&#xff0c;分 master 節點和 worker 節點&#xff0c;節點可以是虛擬機也可以是物理機。K8S組件 master 節點組件Kube-apiserver 用于暴露 Kubernetes API&#xff0c;任何資源請求或調用操作都是通…

PyTorch API 5

文章目錄torch.compiler延伸閱讀torch.fft快速傅里葉變換輔助函數torch.func什么是可組合的函數變換&#xff1f;為什么需要可組合的函數變換&#xff1f;延伸閱讀torch.futurestorch.fx概述編寫轉換函數圖結構快速入門圖操作直接操作計算圖使用 replace_pattern() 進行子圖重寫…