没有匹配字母的字母的 Sed 正则表达式

Sed regular expression with no letters matching letters

我正在尝试查看一个文件并找到所有大于 16000 的数字并将它们替换为数字 16000。我一直在使用 sed 并创建了一个正则表达式

sed 's/[1]\{1\}[6-9]\{1\}[0-9]\{3\}/16000/g'

问题在于它匹配文件中的内容,例如 A17890qr。考虑到我的表达式中没有字母,我不明白为什么要匹配这个。

示例输入

A17890qr,1000,17000,18000,1500,140,19900

示例输出

A17890qr,1000,16000,16000,1500,140,16000

编辑:我已将正则表达式更改为

sed 's/[^a-z A-Z][1]\{1\}[6-9]\{1\}[0-9]\{3\}/16000/g'  

但现在从示例输入中我得到了

的输出
A17890qr,10001600016000,1500,14016000

使用 awk:

awk 'BEGIN{FS=OFS=","} {for (i=1; i<=NF; ++i){ if ($i ~ /^[0-9]+$/ && $i > 16000) {$i=16000}}}1' file

输出:

A17890qr,1000,16000,16000,1500,140,16000

在 perl 中

perl -pe 's/\b\d+\b/$&>16000?16000:$&/ge' file

对于每个以边界为边界的数字,检查它是否大于 16000,如果大于则替换。

sed 's/[^a-zA-Z][1]\{1\}[6-9]\{1\}[0-9]\{3\}/,16000/g'

这确实解决了这个问题,但在您尝试时却没有解决

19000,A17890qr,1000,17000,18000,1500,140,19900

输出为

19000,A17890qr,1000,16000,16000,1500,140,16000