用于文本处理的 Sed 分组和反向引用

2023-10-21

分组和反向引用是正则表达式中的基本概念,sed为两者提供支持。

分组允许您将多个字符视为一个单元,而反向引用允许您引用先前匹配的组。

在本教程中,我们将介绍与分组和反向引用相关的各种主题sed,例如捕获组、组内交替等等。

 

 

捕获组和反向引用

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


John Doe
Jane Doe
  

并且您想将姓名顺序更改为姓氏、名字。您可以使用sed命令与捕获组和反向引用来完成此操作。

Command:


sed 's/\(.*\) \(.*\)/\2, \1/' names.txt
  

Output:


Doe, John
Doe, Jane
  

在此命令中,搜索模式\(.*\) \(.*\)用于匹配整行并捕获名字和姓氏。首先\(.*\)捕获第一个名称和第二个名称\(.*\)捕获姓氏。

替换模式\2, \1用于替换匹配的文本。

The \1是对第一个捕获组的反向引用,并且\2是对第二个捕获组的反向引用。

因此,替换模式会交换名字和姓氏,并在中间添加逗号。

 

在 sed 组中使用大括号 {} 进行重复

大括号{} in sed用于指定一个字符或一组字符的重复。

您可以使用它们来匹配某个字符或一组的特定重复次数。

例如,假设您有一个名为numbers.txt包含以下内容:


111
222
333
  

并且你想改变111 to 1, 222 to 2, and 333 to 3。您可以使用sed带大括号的命令{}来指定重复。

Command:


sed 's/\(1\)\1\{2\}/\1/' numbers.txt
  

Output:


1
222
333
  

在此命令中,搜索模式\(1\)\1\{2\}用于匹配111在输入中。这\(1\)捕获第一个1,以及\1\{2\}匹配接下来的两个1s.

替换模式\1用于将匹配的文本替换为第一个捕获的组,即1.

因此,111被替换为1在输出中。

您可以再次运行该命令2 and 3改变222 to 2 and 333 to 3.

 

在组内使用交替 (|)

交替进行sed用于匹配 this OR that。您可以使用管道符号|团体内部()来指定交替。

请注意,您需要使用-E启用扩展正则表达式的选项sed为了这个工作。

例如,假设您有一个名为days.txt包含以下内容:


Monday
Tuesday
Wednesday
  

而你想更换Monday or Wednesday with Holiday。您可以使用sed通过在小组内轮流指挥来实现这一目标。

Command:


sed -E 's/(Monday|Wednesday)/Holiday/' days.txt
  

Output:


Holiday
Tuesday
Holiday
  

搜索模式(Monday|Wednesday)用于匹配Monday or Wednesday在输入中。

替换模式Holiday用于替换匹配的文本。

 

成组转义括号和元字符

In sed, 括号()用于分组,但如果您想匹配输入中的文字括号或其他元字符,则需要使用反斜杠对其进行转义\.

例如,假设您有一个名为data.txt包含以下内容:


(abc) def (ghi)
  

并且您想删除括号。您可以使用sed带有转义括号的命令来完成此操作。

Command:


sed 's/(/[/g; s/)/]/g' data.txt
  

Output:


[abc] def [ghi]
  

在此示例中,sed命令替换所有出现的( with [以及所有出现的) with ].

但是,如果您正在使用sed-E选项(启用扩展正则表达式),括号( and )默认情况下被视为特殊字符,您必须对它们进行转义才能将它们视为文字字符:


sed -E 's/\(/[/g; s/\)/]/g' data.txt  

该命令将产生与前面的示例相同的输出。

 

反向引用的限制和边缘情况

反向引用位于sed功能强大,但您应该注意一些限制和边缘情况:

  1. 反向引用数量有限: In sed,您最多只能使用 9 个反向引用(\1 to \9)在替换模式中。如果搜索模式中的捕获组超过 9 个,则只能在替换模式中引用前 9 个。
  2. 不支持 Lookahead 和 Lookbehind 断言: 如前面提到的,sed不支持lookahead和lookbehind断言,这在某些情况下会限制反向引用的使用。
  3. 不支持嵌套捕获组: sed不支持嵌套捕获组,这可能会导致在某些情况下难以使用反向引用。

 

使用组和反向引用时的常见错误

在中使用组和反向引用sed可能很棘手,人们经常犯一些常见的错误:

  1. 不转义特殊字符:在基本正则表达式(BRE)中,这是默认模式sed, 特殊字符如(, ), {, and }必须用反斜杠转义\被视为组分隔符或重复运算符。例如,\( and \)用于分组,并且\{m,n\}用于重复。
  2. 使用错误的反向引用:反向引用\1 to \9按照捕获的组在搜索模式中出现的顺序引用它们。在替换模式中使用错误的反向引用是一个常见的错误。
  3. 混淆分组和捕获:所有捕获组( ... )也是分组构造,但并非所有分组构造都是捕获组。例如,(?: ... )是一个非捕获组,它将所包含的标记进行分组,但不捕获匹配的文本。
  4. 不考虑换行: 默认情况下,sed逐行处理输入,因此^ and $锚点匹配行的开头和结尾,而不是整个输入的开头和结尾。如果您需要处理多行,则需要使用N命令将下一行输入附加到模式空间。
  5. Using *代替.*: *匹配零个或多个前面的标记,而.*匹配零个或多个任何字符(换行符除外)。这是一个常见的错误使用*代替.*在搜索模式中。

 

使用 sed 进行高效日志处理

我从事的一项特别的自由职业是为一位美国客户提供服务,该客户有大量日志文件需要处理和重新格式化。

该日志文件包含大约 1000 万行文本,每行都有一组由分隔符分隔的值。

客户端需要重新排列文本的某些部分、交换一些值并删除冗余条目。

我尝试使用Python来处理该文件,但由于文件太大,处理时间太长。

然后我意识到 Linux 中的 sed 命令非常适合这项任务,因为它是为文本处理而设计的,可以直接处理文件,而无需将整个文件加载到内存中。

分组允许您将正则表达式的一部分分组在一起,而反向引用允许您重新引用分组的文本。

这些行是这样的:


timestamp|IP|URL|status  

客户希望将其重新安排为:


IP|timestamp|status|URL  

我可以使用带有分组和反向引用的 sed 命令来轻松地重新排列文本:


sed 's/\(.*\)|\(.*\)|\(.*\)|\(.*\)/\2|\1|\4|\3/' input.log > output.log  

在此命令中, s 表示sed执行替换,() 用于对文本的各个部分进行分组。 ‘\1’、‘\2’等是反向引用,指的是文本的分组部分。

Using sed通过分组和反向引用,我能够在 30 分钟内处理 1000 万行文件,而我最初编写的 Python 脚本只能在相同的时间内处理文件的 10% 左右。

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

用于文本处理的 Sed 分组和反向引用 的相关文章

随机推荐

  • 如何在 Ubuntu 18.04 LTS 上安装 Swift

    Swift 是一种安全 快速 富有表现力的通用编程语言 专为软件设计模式而构建 它最适合系统编程 移动和桌面应用程序 Swift 提供了大量功能 使编程变得更加容易 同时为开发人员提供了真正的系统编程语言所需的控制能力 本教程将帮助您在 U
  • 解决 MySQL 错误 1041 (HY000):内存不足

    在使用 MySQL 时 您可能偶尔会遇到以下情况 错误 1041 HY000 内存不足错误 此错误表明 MySQL 服务器 mysqld 在尝试执行操作时内存不足 此类问题可能有点令人困惑 特别是如果您的服务器似乎有足够的可用内存 让我们深
  • 什么是 500 内部服务器错误

    浏览网页时最常见的错误之一是 500 内部服务器错误 此消息表明网络服务器遇到技术问题 本文解释了 500 错误的含义 为什么会收到 HTTP 500 代码以及如何解决这些错误 什么是 HTTP 500 错误 每次打开网页时 浏览器都会向托
  • Linux 中的 Basename 命令

    basename是一个命令行实用程序 可以从给定的文件名中删除目录和尾随后缀 使用basename命令 The basename命令支持两种语法格式 basename NAME SUFFIX basename OPTION NAME bas
  • 如何在 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 捕获