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

时间:2017-10-26 04:50:30

标签: regex bash sed windows-subsystem-for-linux

我正在尝试浏览一个文件并查找大于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

3 个答案:

答案 0 :(得分:2)

在perl

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

对于边界检查的每个数字,如果它超过16000并且如果是则替换。

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

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