sed語句用法

来源:https://www.cnblogs.com/Their-own/archive/2022/09/15/16698239.html
-Advertisement-
Play Games

sed高階用法 sed編輯器 sed是一種流編輯器,流編輯器會在編輯器處理數據之前基於預先提供的一組規則來編輯數據流。 1.sed編輯器工作流程 sed編輯器可以根據命令來處理數據流中的數據,這些命令要麼從命令行中輸入,要麼存儲在一個命令文本文件中。 sed的工作流程主要包括讀取、執行和顯示三個過程 ...


sed高階用法

sed編輯器

sed是一種流編輯器,流編輯器會在編輯器處理數據之前基於預先提供的一組規則來編輯數據流。

1.sed編輯器工作流程

sed編輯器可以根據命令來處理數據流中的數據,這些命令要麼從命令行中輸入,要麼存儲在一個命令文本文件中。 sed的工作流程主要包括讀取、執行和顯示三個過程:

  • 讀取: sed從輸入流 (文件、管道、標準輸入) 中讀取一行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)
  • 執行:預設情況下,所有的sed命令都在模式空間中順序地執行,除非指定了行的地址,否則sed命令將會在所有的行上依次執行
  • 顯示:發送修改後的內容到輸出流。在發送數據後,模式空間將會被清空。在所有的文件內容都被處理完成之前,上述過程將重覆執行,直至所有內容被處理完。

模式空間和保持空間

模式空間:sed處理文本內容行的一個臨時緩衝區,模式空間中的內容會主動列印到標準輸出,並自動清空模式空間

保持空間:sed處理文本內容行的另一個臨時緩衝區,不同的是保持空間內容不會主動清空,也不會主動列印到標準輸出,而是需要sed命令來進行處理

模式空間與保持空間的關係

模式空間:相當於流水線,文本行再模式空間中進行處理;
保持空間:相當於倉庫,在模式空間對數據進行處理時,可以把數據臨時存儲到保持空間;作為模式空間的一個輔助臨時緩衝區,但又是相互獨立,可以進行交互,命令可以定址模式空間但是不能定址保持空間。可以使用高級命令h,H,g,G與模式空間進行交互。

sed命令參數

-n 使用安靜模式.則只有經過sed特殊處理的哪一行才會被列出來
-e 傳送帶(前面執行完傳遞給後面)
-f 跟隨腳本文件名
-r 脫意
-i 直接修改讀取文件

sed命令詳解

替換標記

g:表示行內全面替換
w:表示把行寫入一個文件
x:表示互換模式空間的文本和保持空間的文本
y:表示把一個字元翻譯為另外的字元(不用於正則表達式)

單行模式空間

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!

d :刪除,因為是刪除,所以 d 後面通常不接任何東東;

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行

s :取代,通常這個 s 的動作可以搭配正則表達式!例如 1,20s/old/new/g

n:讀取下一個輸入行, 用下一個命令處理新的行

y:把一個或多個字元替換成另一個字元

示例:

#初始
root@localhost ~]# cat test 
a b c
b
c
d

//a的用法
#選擇行下添加
[root@localhost ~]# sed '2a123321' test
a b c
b
123321
c
d
#在匹配的參數下一行進行添加
[root@localhost ~]# sed '/c/a123321' test
a b c
123321
b
c
123321
d

//c的用法
[root@localhost ~]# cat test
a b c
b
c
d
#選擇行進行修改
[root@localhost ~]# sed '3caaa' test 
a b c
b
aaa
d
#將匹配到的參數進行修改
[root@localhost ~]# cat test 
a b c
b
c
d
[root@localhost ~]# sed '/d/caaa' test 
a b c
b
c
aaa

//d的用法
[root@localhost ~]# cat test 
a b c
b
c
d
#將第一行刪除
[root@localhost ~]# sed '1d' test 
b
c
d
#將匹配到的行刪除
[root@localhost ~]# cat test 
a b c
b
c
d
[root@localhost ~]# sed '/b/d' test 
c
d

//i的用法
#選擇行進行插入
[root@localhost ~]# cat test 
a b c
b
c
d
[root@localhost ~]# sed '3i123' test 		
a b c
b
123
c
d
#在匹配的參數前一行進行插入、
[root@localhost ~]# cat test 
a b c
b
c
d
[root@localhost ~]# sed '/b/i123' test 
123
a b c
123
b
c
d

//p的用法
[root@localhost ~]# cat test 
a b c
b
c
d
[root@localhost ~]# sed -n '/a/p' test 		//-n選項:只顯示匹配處理的行(否則會輸出所有)(也就是關閉預設的輸出)
a b c

//s的用法
#將匹配的每行里的第一個參數進行替換
[root@localhost ~]# cat test 
a b c
b
c
d
[root@localhost ~]# sed 's/b/c/' test 
a c c
c
c
d
#如果一行類出現多次參數,就會出現以下問題
[root@localhost ~]# cat test 
a b c
b
c
d
aa
ac
[root@localhost ~]# sed 's/a/c/' test 
c b c
b
c
d
ca
cc
#想要全部替換需要在最後加上g
[root@localhost ~]# cat test 
a b c
b
c
d
aa
ac
[root@localhost ~]# sed 's/a/c/g' test 
c b c
b
c
d
cc
cc

//n的用法,n讀取下一個輸入行
#此處的n不是sed -n的n的那種用法
[root@localhost ~]# cat test 
a b c
b
c
d
aa
ac
[root@localhost ~]# sed -n '/a/n;p' test 		//匹配到的參數下麵的所有行
b
c
d
ac

//y的用法
#將匹配到的整行都進行修改
[root@localhost ~]# cat test 
a b c
b
c
d
aa
ac
[root@localhost ~]# sed '5y/a/C/' test 
a b c
b
c
d
CC
ac

多行空間模式

N:讀取匹配到的行的下一行追加至模式空間
P:列印模式空間開端至\n內容,並追加到預設輸出之前
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本, 並不會讀取新的輸入行,而使用合成的模式空間重新啟動迴圈。如果模式空間 不包含換行符,則會像發出d命令那樣啟動正常的新迴圈

示例

[root@localhost ~]# cat test
here are examples of the UNIX
System. Where UNIX
System appears, it should be the UNIX
Operating System.
[root@localhost ~]# sed '/UNIX$/{N;/\nSystem/s// Operating &/;P;D}' test
here are examples of the UNIX Operating 
System. Where UNIX Operating 
System appears, it should be the UNIX
Operating System.

常用命令

h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換

示例

[root@localhost ~]# cat test
1
2
11
22
111
222

#匹配有1的行,h將將模式空間的內容追加到保持空間,d刪除模式空間的內容
[root@localhost ~]# sed '/1/{h;d}' test
2
22
222

此時
模式空間:
空
保持空間:
1
11
111

#匹配有2的行,G將保持空間的內容追加到模式空間
[root@localhost ~]# sed '/1/{h;d};/2/{G}' test
2
1
22
11
222
111

此時
模式空間:
2
1
22
11
222
111

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、C++中的動態記憶體管理方式 C語言中的動態管理方式是用malloc、free函數,它們在C++仍然可以繼續使用,但是由於在部分地方略顯無能為力,且使用起來比較麻煩,所以C++提出了自己的記憶體管理方式:採用new、delete關鍵字去進行動態記憶體管理。 註意:C語言開闢空間所用的malloc、ca ...
  • 作者:Bai Bing 原文:https://zhuanlan.zhihu.com/p/485029198 遺憾的是,我轉正後看到了大家的能力和努力,也意識到在預期的時間內難以達到我想要的高度,最終經過各方面的考慮,決定放棄這個職位,重新回到外企找回適合我的節奏。 依依不捨的離職後,回想起來,覺得我 ...
  • 我的gRPC之旅。本節介紹微服務架構、強弱類型介面、Rest、gRPC定義,proto編譯方式,並用golang編寫一個簡單的gRPC托管服務和客戶端。在調試中進步,感受gRPC的魅力。 ...
  • 安裝 go https://go.dev/doc/install 安裝以後命令行執行 go version 然後隨便創建一個文件, 比如 hello.go package main import "fmt" func main() { fmt.Println("hello world!") } 這就 ...
  • 本文技術方案支持.Net/.Net Core/.Net Framework 數據分頁,幾乎是任何應用系統的必備功能。但當數據量較大時,分頁操作的效率就會變得很低。大數據量分頁時,一個操作耗時5秒、10秒、甚至更長時間都是有可能的,但這在用戶使用的角度是不可接受的…… 數據分頁往往有三種常用方案。 第 ...
  • 關於/dev/null,以及如何使用它 今天在看MIT的一個課程時,老師給的程式實例中有一個地方沒弄明白: #!/bin/bash echo "Starting program at $(date)" # Date will be substituted echo "Running program ...
  • 源碼安裝apache腳本部署 [root@localhost ~]# ls anaconda-ks.cfg httpd.tar.xz [root@localhost ~]# tar xf httpd.tar.xz 解壓存放腳本的壓縮包 [root@localhost ~]# ls anaconda- ...
  • lrTimelapse for Mac是MAC OS上的一款視頻編輯軟體,lrTimelapse mac是一款配合 Adobe Lightroom、Adobe Camera RAW 和 Adobe After Effects 等程式製作延時攝影的軟體。lrtimelapse mac將帶你到下一個水平 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...