我正在尝试找出如何使用来替换一定次数的模式sed
。
我发现sed
用g
标志替换所有出现的次数,无需 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','
选项进行设置。