没有匹配字母的字母的 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
我正在尝试查看一个文件并找到所有大于 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