一直在寻找其他方法来执行文本编辑操作吗?不需要再找了!这个教程将通过 stream editor(流编辑器)sed 的示例帮助你解决问题。
简而言之,sed 允许你以非交互的方式在文件和文本流上执行各种编辑操作。在调用命令时,你可以根据需要进行编辑决策。在本教程中,你将学习如何使用 sed 命令,有效地优化你的工作流程。
继续阅读,提升你的命令行技能!
前提条件
确保你具备以下内容,以便跟随本教程中的实操演示:
- A command line interface (e.g., Terminal on macOS or Linux) – This tutorial uses Ubuntu Linux 20.04, but the commands should work on most popular operating systems.
- A text editor (e.g., nano, vi, or Sublime Text) – This tutorial uses Nano.
在 Ubuntu 上安装 sed
sed 通常作为标准实用工具包含在大多数类 Unix 操作系统中,包括 Linux 和 macOS。但是,仍然建议在进行文本转换之前,检查一下你的系统是否已经安装了 sed,这是一个基本的操作步骤。
1. 打开终端,并运行下面的sed
命令,检查你的系统上安装了哪个版本的 sed。
如果已经安装了 sed,你将看到 sed 的版本号以及有关构建的一些信息,如下所示。

否則,如果未安裝sed,您將看到以下錯誤消息。
該錯誤消息表示在系統的PATH環境變量中找不到sed命令。

2. 接下來,運行以下命令[apt-get update
以更新並安裝系統上的sed。
此命令從配置的軟件包源中獲取最新的軟件包信息,包括軟件包的依賴關係、文件和腳本。運行此命令是確保安裝最新版本的sed和其他可能需要的軟件包的必要步驟。

3. 最後,運行以下命令以驗證系統上是否安裝了sed命令。
此命令打印sed可執行文件的完整路徑,例如:/usr/bin/sed。
安裝sed並驗證它是否在PATH中後,您可以使用sed
命令進行各種文本轉換和操作。

替換文本文件中的字符串
sed是一個流編輯器,在大多數類Unix操作系統上都可用,其中一個sed最有用的功能是替換文本文件中的字符串。
以下是一些替換字符串有用的場景,但不限於此:
- 更新URL列表以反映新域名。
- 在数据库或CSV文件中更改产品ID。
- 为导入另一个系统格式化数据等等。
使用sed的基本语法如下:
Placeholder | Function |
---|---|
command | Controls sed’s behavior. |
options | Allows you to customize the behavior of the sed command |
input_file | Specifies the file or text stream that you want to edit. Typically, you can specify a single file or stream, but concatenating multiple files or streams by redirection also works. |
output_file | Specifies the file that contains the results of your sed command. The file can be new or the same as input_file, depending on how you use sed. |
假设您有一个名为urls.txt
的文本文件,其中包含一系列URL,并希望更新所有URL以使用新域名。
1. 运行以下echo
命令以在当前目录中创建urls.txt
文件。这些命令不提供输出,而是将指定的文本写入文件。
2. 接下来,运行cat
命令查看urls.txt文件的内容。cat urls.txt
下面的输出确认了写入urls.txt文件的三个旧URL。

3. 现在,运行以下命令在urls.txt
文件中查找并替换(s
)所有字符串old-domain.com
的出现。
您将看到输入文件中的URL已使用新域名更新,如所示。

替换字符串的第N次出现
除了基本的搜索和替换功能外,sed还有其他内置命令,允许您执行更复杂的文本转换。一个这样的情况是替换单行文本中模式字符串的第n次出现。
例如,您希望使用新值更新CSV文件中的第二字段,或者更新数据库转储中字符串的第三次出现。
以下是此命令的基本語法:
pattern
– 要替換的字符串。replacement
– 用作替換的字符串。n
– is the nth occurrence of the string to replace (e.g.,1
=first occurrence,2
=second occurrence…).
要查看如何替換字符串的第n次出現,請按照以下步驟進行:
運行以下echo
命令,以創建一行包含模式quick
三次出現的文本。然後,sed
命令用字符串fast
替換(s
)模式quick
的第二次(2
)出現。
如下所示,只有模式quick的第二次出現被替換為字符串fast,而所有其他出現保持不變。
默認情況下,nth
命令區分大小寫。因此,該命令僅尋找模式的精確匹配。要忽略模式的大小寫,請跳到以下步驟。

? 請注意,
nth
命令從左到右計算模式的出現次數。此外,nth
命令僅在單行文本上運作。要對多行執行替換,請使用以下部分中演示的不同方法。
接下來,運行以下命令,將quick
模式的第二次(2
)出現替換為fast
,同時忽略(i
)大小寫。
在處理具有不一致大寫形式的文本時,i
選項非常方便。
在下面的輸出中,單詞quick(QuiCk)的第二次出現成功被替換為字符串fast – 不論大小寫。

替換所有匹配的模式/字符串
如果你計劃替換所有出現的字符串,那麼這樣做將大大幫助你批量更新每個版權字符串到當前年份。
1. 在您喜歡的文本編輯器中創建一個名為input.txt的文件,內容如下。
This is a quick test.
The quick brown fox jumps over the lazy dog.
Quick, you need to finish this task before it gets too late.
2. 接下來,運行以下命令從input.txt
文件中替換所有出現的單詞quick
為fast
。替換完成後,更改將寫入output.txt
文件。
3. 現在,運行下面的命令查看output.txt
文件的內容,並驗證替換是否已經完成。
您將看到所有出現的單詞quick均已被替換為fast,如下所示。與nth
命令類似,g
命令區分大小寫,只替換完全匹配的內容。
如下所示,字符串Quick不會被替換,但是您可以使用i
選項執行不區分大小寫的替換。

在特定行上替換匹配的模式字符串
也许您已经知道要替换的字符串位于哪一行。如果您可以在特定行替换字符串,为什么要替换所有出现的字符串呢?此功能在对文件或流的特定行进行更改但保持其他行不变时非常有用。
以下是替换特定行字符串的语法,其中n
代表行号。
1. 创建一个名为myfile.txt的文件,并填入以下内容。
test1
test2
test3
2. 接下来,运行以下sed
命令执行以下操作:
- 从
myfile.txt
文件的第二行(2
)开始搜索单词test2
。将单词test2
替换为test2_changed
。将更改写入一个名为myfile_changed.txt
的新文件。
This command does not provide output to the terminal since the changes are written to a new file. But you will verify the changes in the following step.
3. 最后,运行以下cat命令查看myfile_changed.txt
文件的内容。
如下所示,myfile.txt文件的第二行已替换为test2_changed,而所有其他行保持不变。

仅输出更改行的字符串
在进行更改后,您可能希望仅打印更改了的行的内容。如何实现?通过将p
标志与-n
选项一起使用。
以下是仅打印更改行字符串的语法,其中:
-n
选项告诉sed
抑制默认行为,即打印每一行。p
標誌告訴sed
將命令的輸出打印出來。
打開你的 myfile.txt 文件並用以下內容替換其內容。請注意,第二行是錯誤的,因為單詞 first
應該改為 second
。
This is the first line of my file.
This is the first line of my file.
This is the third line of my file.
現在,運行以下 sed
命令來將字符串 first
替換為第二行 (2
) 的 myfile.txt
中的 second
,但僅輸出修改的行 (p
)。
你將在終端上看到僅修改的第二行的輸出,如下所示。

結論
在本教程中,你使用了不同的 sed 使用示例來執行搜索和替換操作。此外,你還涉及了更高級的技術,如替換特定出現次數和僅輸出修改的行。
sed 是一個強大的命令行工具,可以讓你執行各種文本操作任務。無論是在整個文件上進行全局替換還是在特定行上進行定向替換,sed 都能派上用場。
現在,為什麼不深入了解更多關於 正則表達式 的知識呢?正則表達式對於許多文本操作工具都是必不可少的,包括 sed。這些表達式可以節省時間,減少工作量。何時使用?當你在大量文本上執行複雜的搜索和替換操作時。