如何用正则匹配不含指定值的字符串?JSON文件grep实操疑问
解决方法
你的正则思路存在逻辑错误:你写的((?!1)|(?!2)|(?!3))用了逻辑或,意味着只要不是1、不是2、不是3中的任意一个就匹配——但任何数字都会满足至少一个条件(比如"value":1会满足"不是2"和"不是3"),所以这个正则会匹配所有行,完全起不到过滤作用。
下面给两种可行的实现方式:
方式一:负前瞻精准排除
用Perl兼容正则(grep加-P参数),通过负前瞻排除1、2、3这三个单独的数字:
grep -rP '.*"value":\s*(?!(1|2|3)\b)\d+' /path/to/your/json/files
正则解释:
.*"value"::匹配行中到"value":为止的内容\s*:匹配冒号后可能存在的空格(兼容"value":4和"value": 10这类格式)(?!(1|2|3)\b):负前瞻断言,确保后面不是1、2、3加单词边界(避免误排除10、25这类包含1/2/3的多位数)\d+:匹配后续的数字(如果需要支持小数,改成\d+(\.\d+)?)
方式二:反向匹配(更直观)
先匹配所有value为1/2/3的行,再用-v参数反向输出不匹配的行:
grep -rP '.*"value":\s*(1|2|3)\b' /path/to/your/json/files -v
这个方法逻辑更简单,容易理解,适合快速实现需求。
内容的提问来源于stack exchange,提问作者granduser
相关产品推荐
相关产品推荐

