在 Linux 终端中查找和替换文本的 6 种方法
快速链接
- 使用 sed 命令
- 使用 awk 命令替换文本
- 使用 Vim Ex 模式替换文本
- 使用 Bash 脚本
- 使用 tr 命令替换字符集
- 使用perl
通过手动浏览每一行来编辑配置文件或更新大型文档可能会花费大量时间。但是,使用 sed、awk、Vim 等命令行工具,您可以使搜索和替换过程快速高效。
使用 sed 命令
想要快速替换文本吗?使用 sed 命令。使用 sed,您可以查找和修改文件中的文本,处理从简单替换到复杂文本操作的所有内容。
假设您有一个名为 example.txt 的文件,其中包含单词“Linux”,并且您决定将其替换为“Windows”。为此,请运行:
sed 's/Linux/Windows/g' example.txt
这里,s 标志代表替换,g 标志允许 sed 替换每行上出现的所有模式。
前面的命令并没有直接修改原始文件;它仅在终端中显示修改后的输出。但是,如果您想直接操作原始文件,请使用 -i 标志:
sed -i 's/Linux/Windows/g' example.txt
-i 标志直接在文件中进行更改,而不是仅显示输出。
想要在进行更改之前备份您的文件吗?向 -i 标志添加扩展:
sed -i.bak 's/Linux/Windows/g' example.txt
这会在进行任何更改之前创建一个名为 example.txt.bak 的备份文件。
但是如果您希望原始文件保持不变怎么办?您可以创建一个新文件并使用重定向运算符将修改后的输出保存在其中。
例如,要将输出发送到单独的文件,请使用:
sed 's/Linux/Windows/g' example.txt > file.txt
通过将复杂的正则表达式模式与 sed 结合使用,您可以控制在具有重复内容的较大文件中替换哪些内容。要使用单个命令替换多个实例,请运行:
sed -i 's/Linux\|Ubuntu/Windows/g' example.txt
我经常在 sed 中使用的一个技巧是,如果我的搜索或替换字符串包含正斜杠,则切换到不同的分隔符。例如,当我使用文件路径时,我喜欢使用 @ 符号作为分隔符:
sed 's@old/path@new/path@g' file.txt
这使得命令更易于阅读,并避免需要许多转义字符。
使用 awk 命令替换文本
与 sed 一样,awk 也执行简单到高级的文本操作。我经常使用 awk 来处理结构化数据,尤其是 CSV 文件,其中可能需要对选定字段进行计算。
尽管 awk 以管理结构化数据而闻名,但它对于快速查找和替换任务也很有效。例如,要替换文件中的特定文本,您可以使用:
awk '{gsub(/Windows/, "Linux"); print}' file.txt > new_file.txt
此处,gsub 函数执行全局替换,将文件中每一行中出现的所有“Windows”替换为“Linux”。由于 awk 不会直接修改文件,因此我们将输出重定向到 new_file.txt 以捕获更改。
我还使用 awk 来清理数据导出,尤其是电子表格中的数据导出,其中额外的格式可能会使数据处理变得复杂。许多电子表格导出都包含围绕值的引号,这可能会中断其他应用程序中的数据处理。
您可以使用以下命令删除 CSV 文件第一列中的所有双引号:
awk -F, '{gsub(/"/, "", $1); print}' data.csv > cleaned_data.csv
在这里,gsub 仅删除第一列中的每个双引号,并将输出重定向到 clean_data.csv 以供进一步使用。
使用 Vim Ex 模式替换文本
想要在不打开完整编辑器的情况下快速进行文本转换吗?尝试使用 Vim(Vi 改进版),这是一个具有 Ex 模式的文本编辑器,允许您直接从命令行执行查找和替换操作。
首先,使用 Vim 打开文件:
vim filename.txt
然后,按 Esc 进入 Ex 模式,然后使用 (:) 键。这将在终端底部提示您一个冒号 (:),表明您处于 Ex 模式。要查找和替换文本,请使用以下命令:
:%s/macOS/Linux/g
此命令将整个文件中所有出现的“macOS”替换为“Linux”。 % 符号指定该命令应应用于整个文件,末尾的 g 标志确保替换每行上的所有匹配项,而不仅仅是第一个匹配项。
要仅替换每行中的第一个匹配项,只需省略 g 标志即可:
:%s/macOS/Linux/
需要替换特定行范围内的文本吗?指定行范围。例如,要将第 3 行的文本替换为第 10 行:
:3,10s/macOS/Linux/g
我在更改文件时遵循的一个习惯是确认每次替换。这种方法允许仔细的逐行编辑。
要获取每次替换的提示,请在命令末尾添加 c:
:%s/macOS/Linux/gc
使用 Bash 脚本
有时,您可能需要跨多个文件或目录执行一系列查找和替换操作。对于这些情况,使用 Bash 脚本可以自动执行需要很长时间手动完成的任务。
让我们考虑一个简单的脚本,该脚本在当前目录中的多个文本文件中用新字符串替换旧字符串:
#!/bin/bash
for file in *.txt; do
sed -i 's/Windows/Linux/g' "$file"
done
要使用此脚本,首先将其保存到文件(例如 bashexample.sh),然后通过运行以下命令使文件可执行:
chmod +x bashexample.sh
然后,执行脚本:
./bashexample.sh
for 循环迭代当前目录中的所有文本文件,并使用 sed 替换每个文件中的文本。您还可以根据需要修改此脚本以处理不同的模式或文件类型。
用 Python 脚本替换文本
借助 Python 的高级文本处理功能,您可以直接从终端对文件执行查找和替换任务。当您需要更复杂的操作(例如使用条件逻辑处理多个文件)时,Python 脚本非常有用。
首先,创建一个新的 Python 文件。您可以使用任何文本编辑器,例如 nano 或 Vim:
vim textfile.py
接下来,将以下 Python 脚本添加到该文件中:
#!/usr/bin/env python
import sys
with open(sys.argv[1], 'r+') as f:
content = f.read().replace('Windows', 'Linux')
f.seek(0)
f.write(content)
f.truncate()
保存文件后,通过运行以下命令使其可执行:
chmod +x ./testfile.py
然后,通过将目标文件作为命令行参数传递来运行脚本:
python3 ./testfile.py input.txt
此脚本读取 input.txt 的内容,用新文本替换旧文本,并将更改直接保存到文件中。
使用 tr 命令替换字符集
您是否曾经需要将整个文件中的一个字符替换为另一个字符?如果是,那么您需要尝试 tr 命令。该命令非常适合简单的字符替换或删除。
例如,我经常使用它将文本文件中的特定字符转换为大写或小写。要将文本文件中的所有小写 a 和 d 替换为大写 A 和 D,请运行:
tr 'a,d' 'A,D' < example.txt
请记住,tr 适用于字符而不是字符串或单词,因此它最适合简单的字符替换而不是更复杂的模式。
您还可以通过运行以下命令来清理空格或标准化行结尾:
cat messy_file.txt | tr '\r' '\n' > clean_file.txt
这会将 Windows 样式的行结尾 (\r\n) 转换为 Unix 样式的行结尾 (\n),这在跨不同操作系统处理文件时非常有用。
使用perl
Perl 是一种高级编程语言,也可以直接在终端中使用来查找和替换文本,使其成为 sed 的绝佳替代品。它的语法与 sed 类似,但提供了更高级的功能。
就我个人而言,我非常喜欢 Perl,因为它具有特别强大的正则表达式功能,这使其成为复杂查找和替换操作的绝佳选择。
您可以使用以下命令替换文件中的任何单词:
perl -pi -e 's/Linux/Windows/g' file.txt
这里,-pi 标志告诉 perl 就地编辑文件,-e 标志允许您直接传递表达式。此命令通过将整个文件中的“Linux”替换为“Windows”来修改 file.txt。
对于简单的替换,sed、awk 或 perl 等命令行工具效果很好。如果您需要跨多个文件或使用其他逻辑执行更复杂的替换,请选择 Bash 或 Python 脚本。