使用 sed 进行文本替换:替换命令指南

2023-10-21

文本替换是其最常用的功能之一sed命令。当您需要替换大型文件或输入流中的文本模式实例而无需手动编辑每个实例时,此功能非常有用。

文本替换的基本语法sed is:


sed 's/search_pattern/replacement_text/g' filename
  

在这个结构中:

  • s表明我们正在执行替换。
  • search_pattern标识您要替换的字符序列。
  • replacement_text分配您想要的新内容来代替搜索模式。
  • g确保全局替换,这意味着每行中的每个出现都会被替换。没有g,仅处理每行的第一个实例。
  • filename表示您正在使用的目标文件。

默认情况下,sed将修改后的内容发送到标准输出(您的终端)而不更改原始文件。

 

 

替换每行中出现的所有内容

假设您有一个名为sample.txt包含以下内容:


Hello, world!
Hello, user!
Hello, admin!
  

现在,假设您想将每次出现的“Hello”替换为“Hi”。这样做的方法如下:


$ sed 's/Hello/Hi/g' sample.txt
  

Output:


Hi, world!
Hi, user!
Hi, admin!
  

这是我们刚刚所做的细分:

s:表示替换操作。

Hello:这是搜索模式。

Hi:这是替换文本。

g: 指示sed替换一行中出现的所有内容。如果没有它,则只会替换每行中的第一个“Hello”。

如果您想将修改后的内容保存回文件,您可以重定向输出或使用 sed 的就地编辑选项


sed -i 's/Hello/Hi/g' sample.txt  

 

仅替换每行中第一次出现的内容

您可以通过省略将文本替换限制为仅第一次出现g标志在sed命令。

考虑相同sample.txt我们之前使用的文件:


Hello, world! Hello again.
Hello, user! Hello once more.
Hello, admin! Hello for the last time.
  

让我们仅将每行中的第一个“Hello”替换为“Hi”:


$ sed 's/Hello/Hi/' sample.txt
  

Output:


Hi, world! Hello again.
Hi, user! Hello once more.
Hi, admin! Hello for the last time.
  

通过删除g flag, sed只针对每行的第一个“Hello”,后续出现的内容保持不变。

 

使用分隔符

在基本语法中s/search_pattern/replacement_text/g, 人物/是分隔符。

它区分命令、搜索模式和替换。本质上,它讲述了sed一个部分结束而另一部分开始的地方。

更改默认分隔符

如果您的模式或替换文本包含大量正斜杠(常见于文件路径或 URL),不断地用反斜杠转义它们可能会使您的命令难以阅读。

在这种情况下,您可以使用不同的分隔符。

让我们考虑一个您想要替换路径的现实场景/home/user/old_dir with /home/user/new_dir。使用默认分隔符将如下所示:


$ sed 's/\/home\/user\/old_dir/\/home\/user\/new_dir/g' filename.txt
  

这很混乱,不是吗?让我们将分隔符更改为#:


$ sed 's#/home/user/old_dir#/home/user/new_dir#g' filename.txt
  

该命令更具可读性。您可以使用任何字符作为分隔符。

 

不区分大小写的替换

The I标志与sed使您能够执行不区分大小写的搜索和替换,确保您捕获特定模式的所有变体。

让我们使用一个示例文件,cases.txt,包含:


Linux is great.
LINUX is powerful.
linux is open-source.
  

如果您想将“linux”的每个实例替换为“UNIX”,无论大小写,请按以下步骤操作:


$ sed 's/linux/UNIX/Ig' cases.txt
  

Output:


UNIX is great.
UNIX is powerful.
UNIX is open-source.
  

关于可移植性的快速说明:虽然I标志适用于 GNUsed(在 Linux 上常见),如果您使用的是 macOS 或 BSDsed,你会使用i代替旗帜。

 

限制更换数量

With sed,您可以通过在替换命令后附加一个数字来将替换次数限制为特定计数,该数字指示要替换的目标的特定出现次数。

替换特定事件

给定一个文件,repeats.txt,内容如下:


apple apple apple
banana banana banana
cherry cherry cherry
  

假设您只想将每个水果的第二次出现替换为“fruit”。就是这样:


$ sed 's/apple/fruit/2' repeats.txt
  

Output:


apple fruit apple
banana fruit banana
cherry fruit cherry
  

如果您想定位第三次出现,只需将数字更改为 3 即可。

 

转义特殊字符

特殊字符(通常称为元字符)在正则表达式中具有特定含义。

要将它们用作文字字符,或避免它们的特殊含义,您必须使用反斜杠“转义”它们(\).

常见特殊字符

In sed和正则表达式一样,有几个字符具有独特的作用:

  • .: 匹配任意单个字符。
  • *:匹配零个或多个前面的字符或组。
  • ^:将图案锚定到行的开头。
  • $:将图案锚定到线条末端。
  • [...]:匹配括号内的任一字符。
  • ( and ):组模式。

转义特殊字符

要按字面意义使用这些字符中的任何一个sed命令,在它们前面加上反斜杠。

例如,如果您有一个名为special.txt内容:


end...end
start*start
start.end
  

而你想更换... with ---:


$ sed 's/\.\.\./---/g' special.txt
  

Output:


end---end
start*start
start.end
  

在这里,你正在逃避每个时期(.) 带反斜杠以确保sed将它们解释为文字点,而不是匹配任何字符的通配符。

同样,要替换* with +,你会使用:


$ sed 's/\*/+/g' special.txt
  

 

替换多个文件中的文本(sed 和 find)

The find命令允许您在目录层次结构中搜索文件。将其与sed允许您递归地替换多个文件中的文本。

假设您有一个包含各种文本文件的项目,并且您希望将“old_project”的所有实例替换为“new_project”。执行以下命令:


$ find /path/to/directory -type f -name "*.txt" -exec sed -i 's/old_project/new_project/g' {} +
  

分解组件:

  • find /path/to/directory:在指定目录内搜索。
  • -type f:仅针对文件。
  • -name "*.txt":将搜索过滤到.txt files.
  • -exec:对每个找到的项目执行命令。
  • sed -i 's/old_project/new_project/g': The sed你熟悉的命令。这-i旗帜告诉sed就地编辑文件。
  • {} +: 这个语法允许find取代{}找到的文件名,有效地将它们传递给sed命令进行处理。

将 sed 与 xargs 结合使用以增强性能

在某些情况下,您要处理多个文件,使用xargs将通过减少个体数量来提高性能sed产生的进程:


$ find /path/to/directory -type f -name "*.txt" | xargs sed -i 's/old_project/new_project/g'
  

Here, xargs从中获取文件列表find并将它们喂给sed分成更大的块,最大限度地减少进程开销。

基准 exec 与 xargs(xargs 更快)

使用以下方法对文件内容替换的速度进行基准测试sed and find with exec and xargs,我们有一个目录,其中包含 1000 个包含特定模式的文件。

让我们用另一个字符串替换该模式。

这是一个简单的分步指南:

  1. 创建一个包含大量包含特定模式的文件的目录。
  2. 使用以下方法测量更换图案所需的时间find with exec.
  3. 使用以下方法测量更换图案所需的时间find with xargs.

创建包含示例文件的目录:


mkdir benchmark_dir
cd benchmark_dir

# Create 1000 files with the content "replace_me"
for i in {1..1000}; do
    echo "replace_me" > file_$i.txt
done
  

基准测试使用find with exec:


time find . -type f -name '*.txt' -exec sed -i 's/replace_me/replaced/g' {} \;  

Output:


real	0m2.187s
user	0m1.258s
sys	0m0.825s
  

重置文件进行测试xargs:


for i in {1..1000}; do
    echo "replace_me" > file_$i.txt
done
  

基准测试使用find with xargs:


time find . -type f -name '*.txt' | xargs sed -i 's/replace_me/replaced/g'  

Output:


real	0m0.271s
user	0m0.016s
sys	0m0.249s
  

从比较两种方法的实际时间可以看出,由于减少了进程创建的开销,xargs 比使用 exec 更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sed 进行文本替换:替换命令指南 的相关文章

随机推荐

  • 如何在 Linux 上创建可启动的 Ubuntu U 盘

    在本教程中 我们将向您展示如何从 Linux 终端创建可启动的 Ubuntu U 盘 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 运行任何 Li
  • 如何在 Ubuntu 20.04 上安装 Odoo 14

    Odoo 是一款流行的开源商业应用程序套件 可帮助公司管理和运营其业务 它包括广泛的应用程序 例如 CRM 电子商务 网站构建器 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 Odoo根据使用案例和可用技术 可以以不同的方
  • Linux 中的 Ping 命令

    The ping命令是最常用的用于故障排除 测试和诊断网络连接问题的工具之一 Ping 的工作原理是向网络上指定的目标 IP 发送一个或多个 ICMP 互联网控制消息协议 回显请求包 并等待回复 当目的地收到数据包时 它会使用 ICMP 回
  • Linux 中的 Gzip 命令

    Gzip 是最流行的压缩算法之一 它允许您减小文件的大小并保留原始文件模式 所有权和时间戳 Gzip 还指 gz文件格式和gzip用于压缩和解压缩文件的实用程序 在本教程中 我们将向您展示如何使用gzip命令 gzip命令语法 的一般语法为
  • 如何在 Debian 10 上安装 Skype

    Skype是世界上最流行的通信应用程序之一 它允许您免费拨打在线音频和视频电话 并以经济实惠的价格拨打全球手机和固定电话 本文介绍如何在 Debian 10 Linux 上安装最新版本的 Skype 在 Debian 上安装 Skype S
  • 如何在 Ubuntu 20.04 上安装 PHP

    PHP 是最常用的服务器端编程语言之一 许多流行的 CMS 和框架 例如 WordPress Magento 和 Laravel 都是用 PHP 编写的 本指南介绍了在 Ubuntu 20 04 上安装 PHP 并将其与 Nginx 和 A
  • 如何在 Ubuntu 中更改用户密码

    定期更新密码并为每个帐户使用唯一的密码始终是个好主意 作为 Ubuntu 中的普通用户 您只能更改自己的密码 root 用户和具有 sudo 权限的用户可以更改其他用户的密码并定义如何使用或更改密码 本教程介绍如何从命令行或通过 Ubunt
  • 如何在 Ubuntu 20.04 上安装 Nginx

    Nginx 发音为 engine x 是一个开源 高性能的 HTTP 和反向代理服务器 负责处理互联网上一些最大站点的负载 它可以用作独立的 Web 服务器 负载均衡器 内容缓存和反向代理适用于 HTTP 和非 HTTP 服务器 与 Apa
  • 如何在 CentOS 7 上安装 Tomcat 9

    Tomcat 是 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术的开源实现 本教程介绍了在 CentOS 7 上安装 Tomcat 9 0 所需的步骤 先决条件 您登录
  • 如何使用 nmap 命令

    Nmap 是一款功能强大的网络扫描工具 用于安全审计和渗透测试 它是网络管理员用来解决网络连接问题和解决问题的基本工具之一端口扫描 Nmap还可以检测Mac地址 OS type 服务版本等等 本文介绍了如何使用的基础知识nmap命令来执行各
  • 在 Linux 中安装、配置和保护 FTP 服务器

    FTP或文件传输协议是计算机之间传输文件的常用协议 一个充当客户端 另一个充当服务器 在这篇文章中 我们将讨论 Linux 系统中的 FTP 服务器 特别是 Very Secure FTP Daemon vsftpd vsftpd 程序是当
  • Linux curl 命令:来自 Shell 的 Web 交互

    curl是一个功能强大的命令 可让您将数据传输到服务器或从服务器传输数据 它支持多种协议 并且无需用户交互即可处理各种与网络相关的任务 目录 hide 1 安装卷曲 2 支持的协议 3 URL 通配符
  • Pandas isin 方法:Python 中的高效数据过滤

    The isin中的方法Pandas用于过滤 DataFrame 和 Series 它允许您选择一列 或多列 包含特定值的行 在本教程中 我们将探讨其语法和参数 过滤行的基本用法 使用字典和集合进行查找 处理多个条件等等 目录 hide 1
  • 您每天需要的 20 个主要 Linux 命令

    在上一篇文章中 我们讨论了如何安装Linux 现在 我们要谈谈Linux中最强大的功能 那就是Linux命令或shell命令 有关Linux命令的完整文档 您可以查看Linux 文档 Linux 的强大之处在于您可以使用的命令的强大功能 我
  • 使用 Python 网页抓取克服 pandas.read_html 的限制

    熊猫 read html函数是一个非常有用的工具 用于从网页中快速提取 HTML 表格 它允许您仅用一行代码从 HTML 内容中提取表格数据 然而 read html有一些限制 本教程将指导您应对其中一些挑战 并提供克服这些挑战的解决方案
  • 用于文本处理的 Sed 分组和反向引用

    分组和反向引用是正则表达式中的基本概念 sed为两者提供支持 分组允许您将多个字符视为一个单元 而反向引用允许您引用先前匹配的组 在本教程中 我们将介绍与分组和反向引用相关的各种主题sed 例如捕获组 组内交替等等 目录 hide 1 捕获
  • 使用 Linux jq 命令进行 JSON 操作

    jq 是一个轻量级的命令行 JSON 处理器 可帮助您在使用时过滤 解析和操作这些 JSON 响应RESTful API jq不仅仅是一个简单的解析器 它是一个强大的工具 可以转换 重塑和查询 JSON 数据 本教程将深入探讨jqJSON
  • 使用Python下载文件(简单示例)

    在本教程中 您将学习如何使用不同的 Python 模块从网络下载文件 您将下载常规文件 网页 Amazon S3 和其他源 此外 您还将学习如何克服您可能遇到的许多挑战 例如下载重定向文件 下载大文件 多线程下载和其他策略 目录 hide
  • 超过 15 个在 Linux 中列出用户的示例

    在这篇文章中 您将了解如何在 Linux 中列出用户 除此之外 你还会了解有关Linux用户特征的其他技巧 Linux中有两种类型的用户 系统用户是系统默认创建的 另一方面 还有一些由系统管理员创建的普通用户 可以登录系统并使用系统 目录
  • 使用 sed 进行文本替换:替换命令指南

    文本替换是其最常用的功能之一sed命令 当您需要替换大型文件或输入流中的文本模式实例而无需手动编辑每个实例时 此功能非常有用 文本替换的基本语法sed is sed s search pattern replacement text g f