我想用等价的数字替换文本文件中的任何3个或更多数字字符串,*
例如:abc-1234-45-> abc-****-45
echo "abc-1234-45" | sed 's/[0-9]\{3,\}/*/'
我试过了,但只用*代替。
我想用等价的数字替换文本文件中的任何3个或更多数字字符串,*
例如:abc-1234-45-> abc-****-45
echo "abc-1234-45" | sed 's/[0-9]\{3,\}/*/'
我试过了,但只用*代替。
Answers:
您可以使用perl
:
$ echo "abc-1234-45" | perl -pe 's/(\d{3,})/"*" x length($1)/eg'
abc-****-45
/e
标志导致perl
在替换之前将右侧评估为表达式。
sed
而awk
不能。
GNU AWK
echo 'abc-1234-45' |
awk --re-interval -v RS='[[:digit:]]{3,}' '{gsub(/[[:digit:]]/, "*", RT);
printf "%s%s", $0, RT}'
abc-****-45
或者,如果您愿意研究Python
echo 'abc-1234-45' | python -c 'import re; import sys; print re.sub(r"\d{3,}",\
lambda x: len(x.group())*"*", sys.stdin.readline().strip())'
sed
或者awk
-我的意思是在替换之前将字符串作为表达式求值?