首页 > 解决方案 > 如何使用 sed 替换 bash 中第 m 次到第 n 次出现的字符串?

问题描述

我一直在寻找一种简单的方法来使用sed在每行中屏蔽(即替换为 *)给定模式的第 1 次到第 3 次出现。

输入文本的格式是;

$ cat input
1234 4321 2356 7890
3456 4567 8765 0981
2345 2167 9876 1234

所需的输出;

**** **** **** 7890
**** **** **** 0981
**** **** **** 1234

环顾四周后,我找到了仅替换指定模式的第n 次出现的方法。在这里,您如何替换给定输入中每行的第二个块。

$ cat input | sed  's/[0-9]\{4\}/****/2'
1234 **** 2356 7890
3456 **** 8765 0981
2345 **** 9876 1234

我们也可以从第 n 次出现替换给定模式的所有出现。这是你如何做到的。

$ cat input | sed  's/[0-9]\{4\}/****/2g'
1234 **** **** ****
3456 **** **** ****
2345 **** **** ****

PS我会很感激一个简单而愚蠢的解决方案。不是sed中带有awk或标签和循环的解决方案。

标签: sedtext-processing

解决方案


使用您的简单输入示例:

sed -r 's/([0-9]{4} ){3}/**** **** **** /' input

https://unix.stackexchange.com/a/155810/57293中给出了更复杂的解决方案。

另一个简单的解决方案(当您知道行中模式的 nr 时)是

rev input | sed -r 's/[0-9]{4}/****/g2' | rev

推荐阅读