sed - 如何使用 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或标签和循环的解决方案。
解决方案
使用您的简单输入示例:
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
推荐阅读
- multi-tenant - NestJS 请求多个数据库的范围多租户
- rest - 如何将多个 HTTP 动词映射到 HTTP4K 中的同一路径
- asp.net-core-signalr - 如何强制 JSONSerialiser 处理引用循环?
- linux - 删除句号后的第一个大写单词
- angular - 注入 ActivatedRoute 会产生循环依赖错误
- algorithm - 将数字 (x1, x2, x3, ...) 分配给列表 (a1, a2, a3, ...) 中的每个元素,以便 a1/x1 类似于 a2/x2 等等
- javascript - 如何处理 Django Web 应用程序中数据库的实时搜索?
- javascript - 如何将 state 属性设置为 false
- sql - 有多少比特币从一个钱包转移到另一个钱包?
- python - 如何找到一个数的最大可能奇数