使用 sed 命令掌握 Linux 文件中的文本插入

2023-10-16

The ised 中的命令用于在行前插入文本。的一般语法为i命令是:


sed '/pattern/i\text-to-be-inserted' filename
  

在本教程中,我们将重点介绍如何使用sed命令.

 

 

Sed Insert 让我们免于数月的手动编辑

有一天,当地一家小型 ISP 向我提出了一个有趣的问题。他们最近迁移了用户数据库,在此过程中,忽略了一个关键的格式更改。

他们拥有超过 100,000 条用户记录的列表,并且每条记录都缺少新系统所需的重要标识符。每条记录的格式如下:


username:hashed-password:account-status  

但新系统需要:


username:hashed-password:UID:account-status  

Here, UID代表用户标识符,每个用户的唯一字母数字字符串。

如果没有 UID,ISP 的整个计费和使用跟踪系统就会出现故障,可能会导致重大收入损失和客户不满。

为超过 100,000 条记录手动插入这些 UID 不仅不切实际,而且对于他们的小团队来说会花费数月时间。

我决定使用sed命令自动插入 UID。我编写了一个简单的脚本,为每个用户生成一个 UID,然后使用sed将其插入到每条记录中的适当位置。

这是我使用的命令的简化示例:


sed -i 's/\(username:hashed-password:\)\(account-status\)/\1UID:\2/' user-database.txt  

通过这个单一的命令,sed不到 10 分钟就处理了该文件。

与手动编辑文件相比,一个小团队可能需要花费 800 多个小时(考虑用 5 分钟来编辑和验证每条记录)。

 

在特定行插入文本

要使用 sed 在文件中的特定行号处插入文本,可以使用以下语法:


sed 'LINE_NUMBER i\text-to-be-inserted' filename
  

例如,如果您想插入文本“This is line 3”。在“example.txt”文件的第三行,您可以使用以下命令:


sed '3 i\This is line 3.' example.txt
  

Output:


Apple
Banana
This is line 3.
Cherry
  

在此示例中,“3”是文本“This is line 3”所在的行号。插入到该行之前。

请注意,此命令不会修改原始文件。只在终端中显示修改后的内容。

如果要保存对文件的更改,可以将输出重定向到新文件或使用-ised 的选项。

例如,要将更改保存到新文件:


sed '3 i\This is line 3.' example.txt > newfile.txt
  

或者,要就地修改原始文件,您可以使用-i option:


sed -i '3 i\This is line 3.' example.txt
  

 

在文件开头插入文本

要在文件开头插入文本,可以在 sed 命令中使用行号“1”,如下所示:


sed '1 i\text-to-be-inserted' filename
  

例如,如果您想插入文本“这是文件的开头”。在“example.txt”文件的开头,您可以使用以下命令:


sed '1 i\This is the start of the file.' example.txt
  

Output:


This is the start of the file.
Apple
Banana
Cherry
  

在此示例中,“1”是表示文件开头的行号。因此,文本“这是文件的开头。”被插入到文件的开头。

 

在最后一行之前插入

要在文件的最后一行之前插入文本,可以使用以下命令:


sed '$!b; i\This is the second last line.' example.txt
  

Output:


Apple
Banana
This is the second last line.
Cherry
  

在此命令中,$!b跳过除最后一行之外的所有行,并且“i”命令插入文本“这是倒数第二行”。最后一行之前。

 

在特定匹配之前插入文本

要在包含特定模式的行之前插入文本,您可以使用ised 中的命令如下:


sed '/pattern/i\text-to-be-inserted' filename
  

例如,如果您想插入文本“这是一种水果”。在“example.txt”文件中包含“Cherry”的行之前,您可以使用以下命令:


sed '/Cherry/i\This is a fruit.' example.txt
  

Output:


Apple
Banana
This is a fruit.
Cherry
  

在此命令中,“/Cherry/”是 sed 在文件中搜索的模式。一旦找到带有该模式的行,它就会插入文本“这是一种水果”。在那条线之前。

 

在两个特定行之间插入文本

您可以结合i and ased 中的命令在两个特定行之间插入文本。

例如,如果要在第二行和第三行之间插入文本example.txt文件,可以使用以下命令:


sed '2 a\This is between second and third line' example.txt
  

Output:


Apple
Banana
This is between second and third line
Cherry
  

在此示例中,“2”是行号,在其后插入文本“This is Between Second and Third Line”。

 

基于模式的条件插入

仅当该行与特定模式匹配时,您才可以在该行之前或之后插入文本。

例如,如果您想在“example.txt”文件中包含“Banana”的行之前插入文本,但前提是该行还包含“Apple”,则可以使用以下命令:


sed '/Banana.*Apple/ i\This is a fruit.' example.txt
  

假设“example.txt”文件包含一行同时包含“Apple”和“Banana”的行:


Apple
Banana Apple
Cherry
  

Output:


Apple
This is a fruit.
Banana Apple
Cherry
  

在此示例中,模式“/Apple.*Banana/”与行“Banana Apple”匹配,因此文本“This is a Fruit”。插入该行之前。

 

插入转义字符

转义字符是用来表示某些特殊字符的字符,如换行符、制表符等。在 sed 中,转义字符前面有一个反斜杠 ()。

例如,如果要在“example.txt”文件的开头插入包含制表符、换行符和反斜杠的行,可以使用以下命令:


sed '1 i\\\t\\n\\' example.txt
  

Output:


\t\n\
Apple
Banana
Cherry
  

在此命令中,“1”是插入文本“\t\n”的行号。

由于sed中反斜杠用于转义字符,因此需要使用两个反斜杠()来表示单个反斜杠。

 

插入变量值和命令替换

您还可以使用 sed 插入变量值或命令输出。

例如,如果要在“example.txt”文件的开头插入当前日期和时间,可以使用以下命令:


sed "1 i\\$(date)" example.txt
  

Output:


Sun Sep  5 08:21:10 UTC 2023
Apple
Banana
Cherry
  

在此命令中,1是输出的行号date命令已插入。

 

在特定图案周围插入多条线

如果要插入两行“这是第一行”。和“这是第二行。”在“example.txt”文件中每行包含“Banana”的前后,您可以使用以下命令:


sed -e '/Banana/ i\This is the first line.' -e '/Banana/ a\This is the second line.' example.txt
  

Output:


Apple
This is the first line.
Banana
This is the second line.
Cherry
  

在此命令中,“/Banana/”是匹配包含“Banana”的行的模式。

在上面的命令中,第一个-e选项插入“这是第一行。”在每行包含“Banana”之前,第二个-e选项附加“这是第二行。”在每行包含“Banana”之后。

 

处理多个文件

sed还可以一次处理多个文件,这允许您使用单个命令将文本插入到多个文件中或将不同的文本插入到多个文件中。

例如,如果您想插入“这是一种水果”这一行。在两个文件“example1.txt”和“example2.txt”的开头,您可以使用以下命令:


sed -i '1 i\This is a fruit.' example1.txt example2.txt
  

在此命令中,“1”是文本“This is a Fruit”所在的行号。被插入到两个文件中。这-i选项修改适当的文件。

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

使用 sed 命令掌握 Linux 文件中的文本插入 的相关文章

  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • 高效的内存屏障

    我有一个多线程应用程序 其中每个线程都有一个整数类型的变量 这些变量在程序执行期间递增 在代码中的某些点 线程将其计数变量与其他线程的计数变量进行比较 现在 我们知道在多核上运行的线程可能会无序执行 一个线程可能无法读取其他线程的预期计数器
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 当用户按下打印时运行脚本,并且在脚本结束之前不开始假脱机(linux,cups)

    我需要做的是结合用户按下打印来执行 python 程序 脚本 并且在该程序退出之前不要让打印作业假脱机 原因是打印驱动程序不是开源的 我需要更改用户设置 在本例中是部门 ID 和密码 通常是每个用户 但因为这是一个信息亭 具有相同帐户的不同
  • 如何从 PROC 获取有关子进程的信息

    我正在尝试编写一个以几个进程作为参数的程序 然后父进程执行每个子进程并打印出一些相关的统计信息 示例 generate ls l 将生成一个程序 打印出有关 ls l 的一些统计信息 特别是其系统时间 用户时间和上下文切换次数 我不想使用

随机推荐

  • 让 Shell 访问正在运行的 Docker 容器:实用指南

    Docker 是容器化事实上的标准 提供了一种打包和分发应用程序的有效方法 作为开发人员或系统管理员 有时您可能需要获得对正在运行的 Docker 容器的 shell 访问权限 这可以用于调试目的 应用程序管理或其他各种任务 本指南提供了有
  • 如何在 Git 存储库中创建分支

    Git 是一个强大的版本控制系统 被软件开发人员广泛使用 Git 的关键功能之一是能够在单个存储库中创建和管理多个分支 在本文中 我们将分步讲解创建 Git 分支的过程 第 1 步 了解 Git 分支 在我们深入创建 Git 分支之前 了解
  • 如何在 Bash Shell 脚本中使用函数

    什么是功能 函数也可以称为子例程 过程是用于特定任务的代码块 函数还有一个属性 称为可重用性 本教程将帮助您了解如何在 shell 脚本中创建和使用函数 在 Shell 脚本中创建第一个函数 在 shell 脚本中创建第一个函数 显示输出
  • 如何在 Git 中列出远程分支

    Git 是一种流行的版本控制系统 开发人员使用它来跟踪对其代码所做的更改 分支是 Git 的一个重要方面 因为它们允许开发人员并行处理多个功能或修复错误 而不会影响主代码库 在 Git 中 您可以创建两种类型的分支 本地分支和远程分支 本地
  • 如何在 MacOS 上安装 VirtualBox

    如何在 macOS 上安装 VirtualBox 在 macOS 系统上安装 VirtualBox 以及扩展包的分步教程 VirtualBox 是一款流行的跨平台虚拟机管理器 可让您在 Mac 上创建虚拟机 VM VM可用于同时运行不同的操
  • 如何在 Ubuntu 18.04 上安装 Anaconda

    Anaconda 是最流行的 Python 数据科学和机器学习平台 用于大规模数据处理 预测分析和科学计算 Anaconda 发行版附带了 1 000 多个数据包 conda命令行工具和名为 Anaconda Navigator 的桌面图形
  • 如何检查Python版本

    Python 是世界上最流行的编程语言之一 它用于开发网站 编写脚本 机器学习 分析数据等 本文介绍如何使用命令行检查操作系统上安装的 Python 版本 这在安装需要特定版本 Python 的应用程序时非常有用 我们还将向您展示如何以编程
  • 如何在 Ubuntu 18.04 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 在虚拟机上运行 Ubuntu 时 不存在交换分区 唯一的
  • Linux 中的终止命令

    Linux是一个伟大而先进的操作系统 但它并不完美 有时 某些应用程序可能会开始表现不稳定并变得无响应或开始消耗大量系统资源 无响应的应用程序无法重新启动 因为原始应用程序进程永远不会完全关闭 唯一的解决方案是重新启动系统或终止应用程序进程
  • 如何更改 Linux 中的 Swappiness 值

    交换空间是 RAM 内存已满时使用的硬盘的一部分 交换空间可以是专用交换分区或交换文件 当 Linux 系统耗尽物理内存时 非活动页面将从 RAM 移至交换空间 Swappiness 是一个 Linux 内核属性 它设置将页面从物理内存换出
  • 如何在 Python 中查找列表的长度

    列表是Python中最常用的数据类型之一 用于存储相同类型的项目的集合 本文介绍如何查找列表的长度 len 功能 Python有一个内置函数len 返回给定对象的长度 该对象可以是一个list 元组 字符串 字典等 的语法len 函数如下
  • Tmux 入门

    本指南将介绍 Tmux 的安装和基本用法 以帮助您入门和运行 什么是 tmux Tmux 是终端多路复用器的替代品GNU 屏幕 换句话说 这意味着您可以启动 Tmux 会话 然后在该会话中打开多个窗口 每个窗口占据整个屏幕 并且可以分割成矩
  • 如何在 Python 中向列表添加元素(追加、扩展和插入)

    在 Python 中使用列表时 您经常需要向列表中添加新元素 Python 列表数据类型具有三种添加元素的方法 append 将单个元素追加到列表中 extend 将可迭代的元素追加到列表中 insert 在列表的给定位置插入单个项目 所有
  • 如何添加 Git 远程

    通常 在使用 Git 时 您将仅使用一个名为 origin 的远程服务器 并针对不同的功能和环境使用不同的分支 Origin 是克隆存储库时自动创建的远程名称 并指向克隆的存储库 然而 当与一群人协作处理一个项目时 您可能会发现使用多个 G
  • Linux 中的 Dig 命令(DNS 查找)

    Dig Domain Information Groper 是一个强大的命令行工具 用于查询 DNS 名称服务器 The dig命令 允许您查询有关各种 DNS 记录的信息 包括主机地址 邮件交换和名称服务器 由于其灵活性和易用性 它是系统
  • 如何在 Ubuntu 20.04 上安装 Zoom

    Zoom是一个易于使用的通信平台 集云视频会议 实时消息传递和内容共享于一体 使用 Zoom 您可以举办网络研讨会 组织在线会议以及创建会议室 本指南介绍如何在 Ubuntu 20 04 上安装 Zoom 相同的说明适用于所有基于 Debi
  • 如何在 Ubuntu 20.04 上安装 Memcached

    Memcached 是一个免费开源的高性能内存键值数据存储 它通常用于通过缓存 API 和数据库调用结果中的各种对象来加速应用程序 本文介绍如何在 Ubuntu 20 04 上安装和配置 Memcached 安装 Memcached mem
  • PyQt5绘图教程(绘画API)

    在本教程中 我们将学习如何绘制矢量图形PyQt5 正如您将看到的 在 Python 中 PyQt5 模块是可用于绘图目的的最简单的模块 在开始之前 让我们使用 PyQt5 创建一个窗口 在其中绘制图形 目录 hide 1 创建一个 PyQt
  • NumPy where 教程(带示例)

    The numpy where函数用于检索 ndarray 中给定条件为 true 的元素的索引 学完本教程后 您将充分了解如何使用numpy where查询NumPy 数组 目录 hide 1 语法和参数 2 使用 x 和 y 参数替换值
  • 使用 sed 命令掌握 Linux 文件中的文本插入

    The ised 中的命令用于在行前插入文本 的一般语法为i命令是 sed pattern i text to be inserted filename 在本教程中 我们将重点介绍如何使用sed命令 目录 hide 1 Sed Insert