- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSite:http://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139298840
HuaWei:https://bbs.huaweicloud.com/blogs/428252
【介紹】:本文sed命令用法。
目 錄
1. sed命令簡介
sed
(stream editor)是一個強大的文本處理工具,用于對文本流或文件進行過濾和轉換。它主要用于自動編輯一個或多個文件;簡化對文件的重復操作;編寫轉換程序等。其語法格式為:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
其中可選選項([OPTION]部分)包括:
-n, --quiet, --silent 抑制自動打印模式空間--debug 注釋程序執行-e script, --expression=script 將腳本添加到要執行的命令中-f script-file, --file=script-file 將腳本文件的內容添加到要執行的命令中--follow-symlinks 處理時跟隨符號鏈接 -i[SUFFIX], --in-place[=SUFFIX] 就地編輯文件(如果提供了后綴,則制作備份)-l N, --line-length=N 指定 `l' 命令的期望換行長度--posix 禁用所有 GNU 擴展-E, -r, --regexp-extended 在腳本中使用擴展正則表達式(為便于移植,請使用 POSIX -E)。-s, --separate 將文件視為獨立的而不是單一的連續長流。--sandbox 在沙盒模式下操作(禁用 e/r/w 命令)。-u, --unbuffered 從輸入文件加載最少量的數據并更頻繁地刷新輸出緩沖區-z, --null-data 以 NUL 字符分隔行--help 顯示此幫助信息并退出--version 輸出版本信息并退出
如果沒有指定 -e
、--expression
、-f
或 --file
選項,則第一個非選項參數將被視為要解釋的 sed
腳本。所有剩余的參數都是輸入文件的名稱;如果沒有指定輸入文件,則讀取標準輸入。
sed '/^$/d' file.txt
這個命令會顯示 file.txt 中所有非空行,不修改原文件。其中,使用正則表達式^$
匹配空行,即開始和結束之間沒有任何字符的行。d 命令用于刪除匹配的行。
sed 's/apple/orange/g' file.txt
這個命令會顯示替換后的內容,不修改原文件。其中:
-
s
表示替換操作。 -
apple
是要查找的文本。 -
orange
是替換后的文本。 -
g
表示全局替換,即替換每一行中的所有匹配項。
例如當前目錄有一個file.text文件為:
執行該命令后輸出結果為:
可見,文檔中所有的“apple”都被替換成了“orange”
sed 's/$/ end of line/' file.txt
這個命令會在每行的末尾添加 " end of line" 文本,它將顯示修改后的內容,不會修改原文件。其中:
$
在正則表達式中表示行的末尾。
例如當前目錄有一個file.text文件為:
執行該命令后輸出結果為:
sed -n '2,6p' file.txt
這個示例的命令用于顯示第 2 行到第 6行的內容。其中:
-
-n
選項與p
命令一起使用,用于抑制自動打印并只打印指定的行。 -
2,6
指定了行范圍。
例如當前目錄有一個file.text文件為:
執行該命令后輸出結果為:
這不會修改原文件。
2.5 將文件中的所有數字增加 1sed 's/[0-9]/&1/g' file.txt
這個命令會在每個數字后面添加 1,如 8 變為 81,顯示修改后的內容,不修改原文件。其中:
-
正則
[0-9]
匹配任何單個數字; -
&
代表匹配到的整個部分(這里是單個數字); -
&1
表示在匹配到的數字后添加 1;
例如有一個file.text文件為:
執行該命令后的結果為:
這不會改變原文件的內容。
sed '/apple$/s/^/#/' file.txt
這個命令會在所有包含 “pattern” 的行前添加 #,顯示修改后的內容打印,不修改原文件。其中:
-
正則
/apple$/
查找包含以 “apple” 結尾的行。 -
s/^/#/
將這些行的開始替換為 “#”,即添加注釋。
例如有一個file.text文件為:
執行該命令后的結果為:
可見,由于第1行、第3行以“apple”結尾,輸出的內容中這兩行前面添加了一個“#”號。
sed '$d' file.txt
這個命令會刪除 file.txt 的最后一行,顯示修改后的內容,不修改原文件。其中:
-
$
表示文件的最后一行。 -
d
是刪除命令。
例如有一個file.text文件為:
執行該命令后的結果為:
sed '1h;1d;$G' file.txt
這個命令會將第一行移動到文件的最后,顯示修改后的內容,不修改原文件。其中:
-
1h
表示將第一行復制到暫存緩沖區。 -
1d
表示刪除第一行。 -
$G
表示在文件的最后一行后追加暫存緩沖區的內容。
例如有一個file.text文件為:
執行該命令后的結果為:
之前給出的示例都不會直接修改文件,但是很多時候我們是希望直接修改文件的。就地編輯是 sed
命令的一個非常有用的功能,允許直接修改文件而不是僅僅輸出修改后的結果。這通過 -i
選項實現,可以選擇性地指定一個后綴來創建原文件的備份。
例如假設有一個名為 example.txt
的文件,內容如下:
Hello, this is a test file.
This file contains some sample text.
We will replace the word 'sample' with 'example'.
執行命令:
sed -i 's/sample/example/g' example.txt
這里:
-i
:表示“就地編輯”,即直接修改原文件而不是輸出到標準輸出。s
:表示替換操作。g
:表示全局替換,即在整個文件中進行替換,而不僅僅是每行的第一個匹配項。
修改后的 example.txt
文件內容將變為:
Hello, this is a test file.
This file contains some example text.
We will replace the word 'example' with 'example'.
可見最后一行的’sample’變成了’example’。
3.2 創建備份并就地編輯如果你想在修改文件的同時創建一個備份,可以在 -i
選項后添加一個后綴。這個后綴將被用作備份文件的擴展名。
sed -i.bak 's/old_text/new_text/g' file.txt
這個命令不僅會修改 file.txt
,還會創建一個名為 file.txt.bak
的備份文件,其中包含原始內容。
繼續使用上面的 example.txt
文件:
Hello, this is a test file.
This file contains some sample text.
We will replace the word 'sample' with 'example'.
執行命令:
sed -i.bak 's/example/sample/g' example.txt
這將把文件中的 “example” 替換回 “sample”,并創建一個包含修改前內容的備份文件 example.txt.bak
。其中:
-
-i.bak
:表示“就地編輯”,并指定.bak
作為備份文件的后綴。這意味著在修改原文件之前,sed
會先將原文件example.txt
復制一份,命名為example.txt.bak
。-
s
:表示替換操作。 -
example
:這是要被替換的文本模式,即查找文本中所有出現的 “example”。 -
sample
:這是替換后的文本,即將找到的 “example” 替換為 “sample”。 -
g
:表示全局替換,即在整個文件中進行替換,而不僅僅是每行的第一個匹配項。
-
修改后的 example.txt
文件內容將變為:
Hello, this is a test file.
This file contains some sample text.
We will replace the word 'sample' with 'sample'.
備份文件 example.txt.bak
的內容為:
Hello, this is a test file.
This file contains some example text.
We will replace the word 'example' with 'example'.
4. 結論與應用
sed
是一個極其強大的流編輯器,它允許我們通過簡單的命令行操作來執行復雜的文本處理任務。無論是進行簡單的文本替換、刪除特定行、還是更復雜的文本操作,sed
都能提供高效且靈活的解決方案。通過上述示例,我們可以看到 sed
在處理各種文本編輯任務時的實用性和便捷性。
-
自動化處理:
sed
可以用于腳本中,自動化處理大量文件,減少重復勞動。例如,編寫一個Dockerfile時,我們可以使用sed來完成文本就地編輯工作:RUN sed -i 's/# DBPassword=/DBPassword=zabbix/g' /etc/zabbix/zabbix_server.conf
其中:
-
-i
:這個選項告訴sed
直接修改文件,而不是輸出修改后的內容到標準輸出。這稱為“就地編輯”; -
's/# DBPassword=/DBPassword=zabbix/g'
:這是一個sed
的替換命令,具體包含以下部分:s
:表示進行替換操作。# DBPassword=
:這是要被替換的文本模式,即查找以# DBPassword=
開頭的文本。這通常表示該行是被注釋的。- DBPassword=zabbix
:這是替換后的文本,即將找到的文本替換為
DBPassword=zabbix。這個操作實際上是取消注釋并設置數據庫密碼為
zabbix`; g
:表示全局替換,即在整個文件中進行替換,而不僅僅是每行的第一個匹配項。
-
/etc/zabbix/zabbix_server.conf
:這是要修改的文件路徑。
-
-
文本分析:可以快速修改或提取文件中的數據,對于日志分析、數據抽取等場景尤為有用。
-
編程輔助:對源代碼進行批量修改,如批量添加注釋、修改變量名等。