linux - sed 仅查找并替换特定的出现次数

标签 linux perl sed

我有以下问题。

我有一个带有序列的文件,我想找到一个特定的模式并将其替换为另一个模式,但仅限于特定的次数。

例如:

ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN

我只想找到“DEFGHI”并将其替换为“ABCDEF”3 次。

sed -i 's/DEFGHI/ABCDEF/g' /home/user/test.txt

我不想全局替换;相反,我只想更换 3 次。

最佳答案

这会将给定的模式替换三次,无论它们在行中的分布方式如何

perl -0777 -pe'$i += s/DEF/xxx/ while $i < 3' < data.txt  > out.txt

它假设模式没有被线打破。它遍历字符串,每次都从头开始搜索。这带有下面解释的警告,效率低下但很简单。

如果替换本身在与周围的文本结合时重新创建了模式,那么这也将在下一次传递中被替换。这样的替换必须以特定方式包含模式本身的部分内容。不过,如果这是一个问题,请告诉我。

问题中没有指定可能重叠模式的处理。如果有任何此解决方案将替换第一个,因此在下一次传递中重叠的解决方案将消失。

关于linux - sed 仅查找并替换特定的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42443410/

相关文章:

linux - 强制查找查找所有子目录

linux - Git 从一个用户帐户 pull 到另一个用户帐户

linux - 为什么 schedule() 在使用默认的 prepare_arch_switch() 时不会导致死锁

perl - Perl 方法返回 "hashref"是什么意思?

bash - 在终端中格式化输出,删除空行并转换逗号

linux - 使用包含文件夹的名称搜索并替换为多个文件

linux - 使用 AWK 或 SED 以及以下标签以逗号分隔

regex - 如何在 zgrep/zcat 命令中指定正则表达式?

mysql - fetchrow_hashref 还是 fetchhash?

perl - 不能使用未定义的值作为符号 perl