使用 sed 在每行中替换模式一定次数

使用 sed 在每行中替换模式一定次数

我正在尝试找出如何使用来替换一定次数的模式sed

我发现sedg标志替换所有出现的次数,无需 1 次,用指定的数字替换这次出现的次数,g3大于/等于 3。

但是如何替换某个部分或者小于某个数字的模式呢?

例如输入,一行包含卡号,我想对其中的一部分进行哈希处理

1234 1234 1234 1234  
1234 1234 1234 1234
1234 1234 1234 1234
1234 1234 1234 1234 

命令:

$ sed "s/[0-9]\\{4\\}/\\*\\*\\*\\*/g"
**** **** **** ****
$ sed "s/[0-9]\\{4\\}/\\*\\*\\*\\*/g3"
1234 1234 **** ****
$ sed "s/[0-9]\\{4\\}/\\*\\*\\*\\*/2"
**** 1234 **** ****

我正在寻找用哈希值替换特定模式出现次数的方法,例如 1-3 或 <3。对于每行中模式出现的次数,可以是 5-10 或其他数字

答案1

GNU sed,是的,有那个选项来替换g一个模式的所有出现或从第X次出现到之后的所有出现gX,但你可以使用这两个扩展来实现你想要替换的内容第一的Y 像下面这样出现,取代 PATTERN 的前 3 次出现。

sed -E 's/PATTERN/TEMP-REPLACE/g4; s/PATTERN/REPLACE/g; s/TEMP-REPLACE/PATYERN/g' infile.txt

另外,作为非 GNU 解决方案,您可以用 Ysed个部分替换 PATTERN 的 Y 次,如下所示,

sed -E -e 's/PATTERN/REPLACE/' -e 's/PATTERN/REPLACE/' -e 's/PATTERN/REPLACE/'

问题修改后更新答案

您可以使用awk它为 START 和 END 定义两个控制标志,并执行以下操作:

awk -v START=1 -v END=5 '{for (i=START;i<=END;i++) gsub(/PATTERN/,"****",$i)}1' infile.txt 

请注意,默认情况下awk考虑读取由 标签或者空间,如果你的不同或者你想告诉 awk 它例如是,,你可以使用它的-F','选项进行设置。

相关内容