sed——Stream Editor流編輯器

文章目錄

  • 前言
  • 一、什么是sed
  • 二、sed的原理
    • 2.1 sed工作流程的三個步驟
    • 2.2 sed的兩個重要空間:
    • 2.3 sed的具體運作流程
  • 三、sed的常見用法
    • 3.1 sed的基本格式
    • 3.2 常用選項
    • 3.3 常用操作
      • 3.3.1 基本語法規則
      • 3.3.2 常用操作命令
    • 3.4 操作用法示例
      • 3.4.1 輸出符合條件的文本(`p` 正常輸出)
      • 3.4.2 結合正則表達式進行輸出
      • 3.4.3 刪除符合條件的文本`d`
      • 3.4.4 替換符合條件的文本`tr`
      • 3.4.5 遷移符合條件的文本
      • 3.4.6 使用腳本編輯文件
  • 四、生產環境的sed使用
    • 4.1 修改ip/監聽地址
    • 4.2 編寫vsftpd服務的自動配置
  • 總結


前言

想象一下,你正在整理一堆雜亂的文件,手忙腳亂地復制、粘貼、刪除某些內容,甚至還要批量替換某些詞。如果手動操作,不僅容易出錯,還特別浪費時間。這時候,sed就像一位低調但高效的文本編輯助手,幫你自動完成這些繁瑣的任務。

它不會像圖形化工具那樣花哨,但只要你告訴它規則,比如“把所有的‘蘋果’換成‘橙子’”或者“刪除空行”,它就能眨眼間搞定。它的風格簡潔直接,擅長處理一行一行的文本,就像流水線上的工人,精準又高效。

不過,如果你覺得sed只能做簡單的“查找替換”,那就太小看它了——它還能匹配模式、條件編輯,甚至結合正則表達式玩出更復雜的操作。而當你熟悉了sed之后,可能會發現,有時候你需要的不只是編輯文本,還要分析、計算、提取數據……這時候,另一位更強大的搭檔awk就該登場了。

但別急,先讓我們把sed的基本功練扎實,畢竟再厲害的編程技巧,也得從最順手的小工具開始。


一、什么是sed

sed(Stream EDitor,流編輯器)是一個強大而輕量的流式文本編輯器。它誕生于 Unix 早期,由 Lee E. McMahon 于 1973 年到 1974 年間開發,是 Linux/Unix 系統中最基礎和最重要的工具之一。

它的核心特點如下:

  • 非交互式:與 vimnano 這類交互式編輯器不同,sed 通過接收命令或腳本文件來批量處理文本,無需用戶介入。這使得它非常適合在腳本和自動化任務中使用。
  • 面向數據流sed 逐行處理輸入(可以是文件或標準輸入),將結果輸出到標準輸出。它不會直接修改原始文件(除非明確指定),這保證了操作的安全性。
  • 功能強大:主要功能包括文本替換、刪除、打印、插入、追加、模式匹配等,尤其擅長查找和替換
  • 基于正則表達式:其強大的模式匹配能力建立在正則表達式之上,可以非常靈活地定位文本。

簡單來說,sed 就像一個預設了規則的過濾器和加工器,文本流經過它,會被自動地按照指令進行修改和整理。


二、sed的原理

2.1 sed工作流程的三個步驟

理解 sed 的原理是掌握它的關鍵。其工作流程可以概括為以下三個步驟:

  1. 讀取(Read)

    • sed 從輸入流(文件或管道)中一次讀取一行內容。
    • 將這行內容存儲在其內部的臨時緩沖區中,這個緩沖區稱為模式空間(Pattern Space)
  2. 執行(Execute)

    • 將用戶提供的所有 sed 命令(或腳本中的命令)按順序應用到模式空間中的內容上。
    • 這是核心步驟,所有的替換、刪除、打印等操作都在這里發生。
  3. 輸出(Print)

    • 執行完所有命令后,除非有特殊指令(如 d 刪除命令),否則模式空間中當前的內容會被自動輸出到標準輸出(屏幕)。
    • 然后清空模式空間,接著讀取下一行,重復上述過程,直到處理完所有輸入行。

這種 “讀取-執行-輸出” 的流水線模式,使得 sed 在處理超大文件時效率極高,因為它永遠不會將整個文件加載到內存中。

2.2 sed的兩個重要空間:

  • 模式空間(Pattern Space):如上所述,這是當前處理行的“工作臺”,大部分操作都在這里進行。
  • 保持空間(Hold Space):一個輔助的緩沖區,用作臨時存儲。模式空間的內容可以和保持空間進行交換(gh)、追加(G)等操作,用于實現更復雜的多行處理功能。

2.3 sed的具體運作流程

  1. 將一行的內容讀入模式空間。
  2. 從指定的操作指令中取出第一條指令,判斷是否匹配pattern。
  3. 如果不匹配,直接不執行匹配條件后的編輯命令,轉而讀取下一條指令;如果匹配則執行編輯命令,對模式空間內的內容進行編輯,然后讀取下一條指令。
  4. 當所有指令執行完畢,默認會輸出模式空間內的內容,然后清空模式空間,讀取下一行的內容。
  5. 當完成對所有行的讀取時,結束。

注意:默認情況下所有的 sed 命令都是在模式空間內執行的,因此輸入的文件并不會發生任何變化,除非是用重定向存儲輸出(-i)。


三、sed的常見用法

3.1 sed的基本格式

調用sed命令有兩種基本格式:

# 一、直接輸入操作
sed [選項] '操作' 參數
# 二、通過調用腳本進行操作
sed [選項] -f scriptfile 參數

其中,“參數”指操作的目標文件,多個文件時用逗號分隔;“scriptfile”為腳本文件,需用 -f 指定。

3.2 常用選項

以下是 sed 常用選項的表格整理:

短選項長選項功能描述
-e--expression=用指定命令或腳本處理輸入文件,可多次使用以疊加修改
-f--file=用指定腳本文件中的命令處理輸入文件
-h--help顯示幫助信息并退出
-n--quiet/silent僅顯示被腳本處理后的行(默認輸出所有行)
-i.bak-直接修改原文件(.bak為備份擴展名,可省略則僅修改不備份)
-r/-E-使用擴展正則表達式(-r為GNU擴展,-E符合POSIX)
-s-將多個輸入文件視為獨立文件,而非連續流(默認合并處理)

  1. -i-i.bak 實際行為相同,差異在于是否保留備份文件(如 -i 直接覆蓋,-i.bak 保留原文件備份)。
  2. 部分選項(如 -r/-E)在不同系統實現中可能存在別名差異。

3.3 常用操作

3.3.1 基本語法規則

[n1[,n2]] 格式用于指定行范圍,其中 n1n2 均為行號。

  • 單行操作:n1 表示僅對第 n1 行生效。
  • 范圍操作:n1,n2 表示對第 n1 行至第 n2 行生效。
  • 省略 n1:如 ,n2 表示從第1行至第 n2 行。
  • 省略 n2:如 n1, 表示從第 n1 行至文件末尾。

3.3.2 常用操作命令

  • a:追加內容
    在指定行下方追加新行。
    示例:5a 在第5行下方追加,輸入內容后以 . 結束。

  • c:替換行
    將選定行替換為新內容。
    示例:5,10c 替換第5-10行,輸入新內容后以 . 結束。

  • d:刪除行
    刪除選定行。
    示例:5,20d 刪除第5-20行。

  • i:插入行
    在選定行上方插入新內容。
    示例:5i 在第5行上方插入,輸入內容后以 . 結束。

  • p:打印內容
    顯示選定行內容,常與 -n 參數聯用顯示行號。
    示例:5,20p 打印第5-20行。

  • s:替換文本
    對選定行執行文本替換,語法為 s/原內容/新內容/[g]

    • g 為全局替換標志(可選)。
      示例:5,10s/foo/bar/g 將第5-10行的 foo 替換為 bar
  • y:字符轉換
    按字符一一映射轉換,語法為 y/原字符集/新字符集/
    示例:5,20y/abc/ABC/ 將第5-20行的 a→Ab→Bc→C


3.4 操作用法示例

3.4.1 輸出符合條件的文本(p 正常輸出)

sed -n 'p' test.txt           # 輸出所有內容,等同于 cat
sed -n '3p' test.txt          # 輸出第3行
sed -n '3,5p' test.txt        # 輸出3~5行

在這里插入圖片描述在這里插入圖片描述

sed -n 'p;n' test.txt         # 輸出所有奇數行
sed -n 'n;p' test.txt         # 輸出所有偶數行
sed -n '1,5{p;n}' test.txt    # 輸出1~5行之間的奇數行
sed -n '10,${n;p}' test.txt   # 輸出第10行至文件尾的偶數行

請添加圖片描述
請添加圖片描述

sed -n 'h;n;p;g;p' test.txt  #輸出所有內容,但兩行間的內容互換,h,復制到保存空間,g,從保存空間獲取到模式空間

在這里插入圖片描述

3.4.2 結合正則表達式進行輸出

sed -n '/the/p' test.txt        # 輸出包含 the 的行
sed -n '4,/the/p' test.txt      # 輸出從第4行至第一個包含 the 的行
sed -n '/the/=' test.txt        # 輸出包含 the 的行號
sed -n '/^PI/p' test.txt        # 輸出以 PI 開頭的行
sed -n '/[0-9]$/p' test.txt     # 輸出以數字結尾的行
sed -n '/\<woood\>/p' test.txt   # 輸出包含單詞 wood 的行,'\< \>'是邊界,被包含的內容會被精確匹配

在這里插入圖片描述在這里插入圖片描述

3.4.3 刪除符合條件的文本d

nl test.txt | sed '3d'                  # 刪除第3行

請添加圖片描述

nl test.txt | sed '3,5d'                # 刪除3~5行

在這里插入圖片描述

nl test.txt | sed '/cross/d'            # 刪除包含 cross 的行

請添加圖片描述

sed '/^[a-z]/d' test.txt                # 刪除以小寫字母開頭的行

在這里插入圖片描述

sed '/\.$/d' test.txt                   # 刪除以“.”結尾的行

請添加圖片描述


sed '/^$/d' test.txt                    # 刪除所有空行# 刪除連續空行(只保留一個)可使用:cat -s test.txt

請添加圖片描述

3.4.4 替換符合條件的文本tr

sed 's/the/THE/' test.txt               # 每行第一個 the 替換為 THE

在這里插入圖片描述

sed 's/l/L/2' test.txt                  # 每行第二個 l 替換為 L

在這里插入圖片描述

sed 's/the/THE/g' test.txt              # 所有 the 替換為 THE

在這里插入圖片描述

sed 's/o//g' test.txt                   # 刪除所有字母 o

在這里插入圖片描述

sed 's/^/#/' test.txt                   # 每行行首插入 #

在這里插入圖片描述

sed '/the/s/^/#/' test.txt              # 在包含 the 的行首插入 #

在這里插入圖片描述

sed 's/$/EOF/' test.txt                 # 每行行尾插入 EOF

在這里插入圖片描述

sed '3,5s/the/THE/g' test.txt           # 將第3~5行中所有 the 替換為 THE

在這里插入圖片描述

sed '/the/s/o/O/g' test.txt             # 在包含 the 的行中所有 o 替換為 O

在這里插入圖片描述

# 直接修改配置文件示例:
sed -i.bak 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config

在這里插入圖片描述

3.4.5 遷移符合條件的文本

  • H:復制到剪貼板;

  • g、G:將剪貼板中的數據覆蓋/追加至指定行;

  • w:保存為文件;

  • r:讀取指定文件;

  • a:追加指定內容。具體操作方法如下所示。

  • I,i 忽略大小寫

sed '/the/{H;d};$G' test.txt             # 將包含 the 的行移至文件末尾

在這里插入圖片描述

sed '1,5{H;d};17G' test.txt              # 將第1~5行內容轉移至第17行后

在這里插入圖片描述

sed '/the/w out.file' test.txt           # 將包含 the 的行另存為文件

在這里插入圖片描述

sed '/the/r /etc/hostname' test.txt      # 在包含 the 的每行后添加文件內容

在這里插入圖片描述

sed '3aNew' test.txt                     # 在第3行后插入新行,內容為 New

在這里插入圖片描述

sed '/the/aNew' test.txt                 # 在包含 the 的每行后插入新行

在這里插入圖片描述

sed '3aNew1\nNew2' test.txt              # 在第3行后插入多行內容

在這里插入圖片描述

sed '/the/IaNew' test.txt # I,i 可用于忽略大小寫

在這里插入圖片描述

3.4.6 使用腳本編輯文件

sed '1,5{H;d};16G'

以上命令可以轉換成腳本文件,將多個編輯指令存入腳本文件(每行一條),通過 -f 調用:

# 編輯腳本文件:
vi opt.list
內容如下:
1,5H
1,5d
16G# 使用腳本:
sed -f opt.list test.txt

|| 表示上一條命令執行失敗后才執行下一條。

四、生產環境的sed使用

4.1 修改ip/監聽地址

需求: 需要將ens33網絡接口的IP地址修改為 192.168.10.100

sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network_scripts/ifcfg-ens33

需求: 需要將 Apache 的監聽地址修改為 192.168.10.100,端口修改為 8080

# 修改監聽地址
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/'
/etc/httpd/conf/httpd.conf# 修改 ServerName
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/'
/etc/httpd/conf/httpd.conf

4.2 編寫vsftpd服務的自動配置

需求: 編寫一個腳本,用來調整 vsftpd 服務配置,要求禁止匿名用戶,但允許本地用戶(也允許寫入)。

#!/bin/bash
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
#系統自帶的變量路徑
CONFIG="/etc/vsftpd/vsftpd.conf"# 備份原配置文件
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak# 調整配置
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG# 重啟并設置開機自啟
systemctl restart vsftpd
systemctl enable vsftpd

總結

別停下,你已手握文本處理的利刃!

sed 看似簡單,卻是自動化腳本的靈魂。每一次精準的替換、每一次高效的刪除,都在為你節省寶貴的時間。
記住:高手不是一天練成的,而是在一次次“查找-替換”中磨出來的。

你已經掌握了原理,接下來就是大膽實踐:

  • 去清理日志、去修改配置、去批量重命名……
  • 讓 sed 成為你的得力助手,把重復勞動交給機器!

未來的你,會感謝現在努力學習的自己。繼續征服命令行,下一站:awk! 🚀

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

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

相關文章

Zotero白嫖騰訊云翻譯

Zotero白嫖騰訊云無限制字數翻譯 文章目錄Zotero白嫖騰訊云無限制字數翻譯1、安裝插件1、登錄騰訊云2、找到訪問管理進入3、創建一個子用戶4、啟用機器翻譯功能5、復制秘鑰6、設置到Zotero1、安裝插件 zotero-pdf-translate&#xff1a;https://github.com/windingwind/zotero…

TCP多進程和多線程并發服務

進程和線程的區別&#xff1a; 詳細的可以參考這樣文檔進程和線程的區別(超詳細)-CSDN博客 核心比喻 進程 一個工廠&#xff1a;這個工廠擁有獨立的資源&#xff08;廠房、原材料、資金、電力&#xff09;。每個工廠之間是相互隔離的&#xff0c;一個工廠著火…

計算機畢業設計springboot基于Java+Spring的疫苗接種管理系統的設計與實現 基于Spring Boot框架的疫苗接種信息管理系統開發與應用 Java與Spring技術驅動的疫苗接種管理

計算機畢業設計springboot基于JavaSpring的疫苗接種管理系統的設計與實現69geq9 &#xff08;配套有源碼 程序 mysql數據庫 論文&#xff09; 本套源碼可以在文本聯xi,先看具體系統功能演示視頻領取&#xff0c;可分享源碼參考。隨著信息技術的飛速發展&#xff0c;計算機技術在…

C/C++圣誕樹①

寫在前面 圣誕節將至&#xff0c;我總想用代碼做點什么&#xff0c;來表達對這個溫馨節日的敬意。于是&#xff0c;我決定用C語言在控制臺中繪制一幅充滿節日氣氛的圣誕樹畫面。它不僅有閃爍的雪花、五彩的燈光&#xff0c;還有一顆顆精心雕琢的心形圖案&#xff0c;仿佛把整個…

【小白入】顯示器核心參數對比度簡介

對比度是一個非常核心的顯示器參數。下面我們來了解一下。一、核心定義&#xff1a;什么是對比度&#xff1f;顯示器的對比度&#xff08;Contrast Ratio&#xff09;是指其最亮狀態&#xff08;白色&#xff09;與最暗狀態&#xff08;黑色&#xff09;之間的亮度比值。簡單來…

【項目】多模態RAG必備神器—olmOCR重塑PDF文本提取格局

【項目】多模態RAG必備神器—olmOCR重塑PDF文本提取格局&#xff08;一&#xff09;olmOCR是什么&#xff1f;&#xff08;二&#xff09;olmOCR 的核心技術&#xff08;1&#xff09;文檔錨定技術&#xff08;2&#xff09;微調 7B 視覺語言模型&#xff08;三&#xff09;olm…

解決Android Studio查找aar源碼的錯誤

我又來給大模型貢獻素材了&#xff01; 問題 在更新了Android Studio Narwhal Feature Drop | 2025.1.2 Patch 1版本之后&#xff0c;遇到了一個問題&#xff0c;很煩人&#xff01;AS每次更新都能搞出點新毛病&#xff0c;真的服了。使用離線依賴aar包引入某個庫之后&#xff…

華為HCIP、HCIE認證:自學與培訓班的抉擇

大家好&#xff0c;這里是G-LAB IT實驗室。 在追求個人職業發展的道路上&#xff0c;取得華為的HCIP或HCIE認證是許多IT從業者的重要目標之一。 但在備考過程中&#xff0c;我們常常面臨一個選擇&#xff1a;是自學還是報名參加培訓班&#xff1f;本文將針對這個問題&#xff0…

空調噪音不穿幫,聲網虛擬直播降噪技巧超實用

虛擬主播團隊負責人來吐槽&#xff01;實時互動是核心&#xff0c;可主播回應慢半拍、動作表情跟不上語音&#xff0c;用戶立馬覺得假&#xff0c;嘩嘩流失。之前方案端到端延遲 700ms&#xff0c;互動總慢一步。直到接入商湯日日新大模型和聲網合作方案&#xff0c;延遲壓到 5…

Spark和Spring整合處理離線數據

如果你比較熟悉JavaWeb應用開發&#xff0c;那么對Spring框架一定不陌生&#xff0c;并且JavaWeb通常是基于SSM搭起的架構&#xff0c;主要用Java語言開發。但是開發Spark程序&#xff0c;Scala語言往往必不可少。 眾所周知&#xff0c;Scala如同Java一樣&#xff0c;都是運行…

智能高效內存分配器測試報告

一、項目背景 這個項目是為了學習和實現一個高性能、特別是高并發場景下的內存分配器。這個項目是基于谷歌開源項目tcmalloc(Thread-Caching Malloc)實現的。tcmalloc 的核心目標就是替代系統默認的 malloc/free&#xff0c;在多線程環境下提供更高效的內存管理。C/C的malloc雖…

吱吱企業通訊軟件以安全為核心,構建高效溝通與協作一體化平臺

隨著即時通訊工具日益普及&#xff0c;企業面臨一個嚴峻的挑戰&#xff1a;如何在保障通訊數據安全的前提下&#xff0c;提升辦公效率&#xff1f;為解決此問題&#xff0c;吱吱企業通訊軟件誕生&#xff0c;通過私有化部署和深度集成的辦公系統&#xff0c;為企業打造一個既可…

校企合作| 長春大學旅游學院副董事長張海濤率隊到訪卓翼智能,共繪無人機技術賦能“AI+文旅”發展新藍圖

為積極響應國務院《關于深入實施“人工智能”行動的意見》&#xff08;國發〔2025〕11號&#xff09;號召&#xff0c;扎實推進學校“旅游”與“人工智能”雙輪驅動的學科發展戰略&#xff0c;加快無人機技術在文旅領域的創新應用&#xff0c;近日長春大學旅游學院副董事長張海…

為什么要用 MarkItDown?以及如何使用它

在處理大量文檔時&#xff0c;尤其是在構建知識庫、進行文檔分析或訓練大語言模型&#xff08;LLM&#xff09;時&#xff0c;將各種格式的文件&#xff08;如 PDF、Word、Excel、PPT、HTML 等&#xff09;轉換為統一的 Markdown 格式&#xff0c;能夠顯著提高處理效率和兼容性…

LVGL9.3 vscode 模擬環境搭建

1、git 克隆&#xff1a; git clone -b release/v9.3 https://github.com/lvgl/lv_port_pc_vscode.git 2、cmake 和 mingw 環境搭建 cmake&#xff1a; https://blog.csdn.net/qq_51355375/article/details/139186681?spm1011.2415.3001.5331 mingw&#xff1a; https://bl…

投影矩陣:計算機圖形學中的三維到二維轉換

投影矩陣是計算機圖形學中的核心概念之一&#xff0c;它負責將三維場景中的幾何數據投影到二維屏幕上&#xff0c;從而實現三維到二維的轉換。無論是游戲開發、虛擬現實&#xff0c;還是3D建模&#xff0c;投影矩陣都扮演著不可或缺的角色。本文將深入探討投影矩陣的基本原理、…

10.2 工程學中的矩陣(2)

十、例題 【例3】求由彈簧連接的 100100100 個質點的位移 u(1),u(2),...,u(100)u(1),u(2),...,u(100)u(1),u(2),...,u(100), 彈性系數均為 c1c 1c1, 每個質點受到的外力均為 f(i)0.01f(i)0.01f(i)0.01. 畫出兩端固定和固定-自由這兩種情形 u 的圖形。 解&#xff1a; % 參數設…

Mysql主從復制之延時同步

1.延時同步概念通過人為配置從庫和主庫延時N小時可以實現延時同步&#xff0c;延時同步可以解決數據庫故障出現的數據丟失問題(物理損壞如直接使用rm刪除數據庫數據和邏輯損壞如使用drop命令刪除數據庫)2.延時同步實操2.1先配置從庫延時同步&#xff0c;并且設置sql線程300秒后…

【QT特性技術講解】QPrinter、QPdf

前言 QT對打印和PDF應用場景&#xff0c;做了簡單的封裝&#xff0c;復雜的功能還是得用第三方庫&#xff0c;打印功能簡單的文本可以不用PDF&#xff0c;涉及圖形的基本都要用到PDF。 Linux打印 隨著國產信創項目替換基于Linux的桌面系統國產信創系統&#xff0c;Linux桌面系…

【大數據技術實戰】Flink+DS+Dinky 自動化構建數倉平臺

一、背景&#xff1a;企業數倉建設的現狀與挑戰在數字化轉型進入深水區的今天&#xff0c;數據已成為企業核心生產要素&#xff0c;而實時數倉作為 “數據驅動決策” 的關鍵載體&#xff0c;其建設水平直接決定企業在市場競爭中的響應速度與決策精度。根據 IDC《2024 年全球大數…