在使用sed找到匹配项后,是否有方法替换以下两行?

我有文件

#ABC
oneSize=bar
twoSize=bar
threeSize=foo

但我想在模式#ABC匹配后,替换两条直接线,使其成为

#ABC
oneSize=foo
twoSize=foo
threeSize=foo

我能做到

但它只改变了第twoSize行,而不是第oneSize

有没有办法让它同时改变单码和双码

推荐答案

gnu和其他一些sed版本允许您使用相对数获取范围,因此您可以简单地使用:

sed -E '/^#ABC$/,+2 s/(Size=)bar/\1foo/' file
#ABC
oneSize=foo
twoSize=foo
threeSize=foo

Command details:

  • /^#ABC$/,+2个匹配范围从模式#ABC到下两行
  • s/(Size=)bar/\1foo/:匹配Size=bar并替换为Size=foo,使用捕获组避免在搜索和替换中重复相同的字符串

您还可以考虑awk,以避免重复模式和替换N次,如果你必须在匹配模式之后替换N行:

awk 'n-- {sub(/Size=bar/, "Size=foo")} /^#ABC$/ {n=2} 1' file

#ABC
oneSize=foo
twoSize=foo
threeSize=foo

Linux相关问答推荐

在Zenity进度窗口上单击取消后如何停止bash脚本

为什么硬编码的阿拉伯字母与Unicode代码点不具有相同的值

运行系统命令失败,但相同的命令可以直接在 bash 中执行

x64 NASM 汇编程序在程序开始时显示分段错误

从 MariaDB 连接到 Oracle 时出现错误消息libsqora.so.11.1:找不到文件

需要获取文件名、行号、模式在文件中的匹配位置

在 Rust 中重命名主线程

从父目录中删除目录而不删除父目录 (Linux)

未找到 SDL_Vertex 和 SDL_RenderGeometry

如何在linux中将2个不同大小的图像(边框,实际图像)合并为1个

如何在 AWS Linux 服务器上实现虚拟主机?

在 Bash 中从最后到第一个输出文件行

Linux 进程在后台 - 在作业(job)中 Stopped停止?

未定义的引用 'shm_open',已在此处添加 -lrt 标志

如何在 Bash 中对齐空格分隔表的列?

使用单个命令打开 .tar.gz 文件

命令列出除 . (点)和..(点点)

如何在shell的递归目录中列出特定类型的文件?

在不运行测试的情况下制作(从源代码安装)python

Linux:删除多个文件的文件扩展名