如何用sed筛选以Dev_开头且结尾为3位及以内数字的字符串?
解决方案
使用sed实现需求
你可以通过sed的多步正则匹配替换完成筛选,精准定位需要保留的模式,删除不符合项后再整理格式:
sed -E ' # 删除所有非Dev_开头的元素 s/"[^"]*"(, )?(?![^[]*Dev_)//g; # 删除Dev_开头但结尾数字超过3位的元素 s/"Dev_.*_[0-9]{4,}"(, )?//g; # 清理数组首尾残留的逗号和多余空格 s/^\[ *, */\[/; s/ *, *\]$/\]/ ' input.txt
命令说明:
-E启用扩展正则表达式,无需转义括号、量词等符号- 第一步匹配所有非
Dev_开头的带引号字符串,连同其后可能的逗号空格一并删除 - 第二步匹配
Dev_开头、末尾为下划线加4位及以上数字的字符串,连同后续逗号空格删除 - 最后两步清理数组首尾的冗余符号,保证输出格式符合JSON规范
更可靠的方案:用jq处理JSON
由于你的输入是标准JSON格式,用jq处理会比sed更稳妥,避免正则匹配JSON时的边缘问题:
jq '[ .[] | select(startswith("Dev_") and test("_([0-9]{1,3})$")) ]' input.txt
命令说明:
.[ ]遍历数组内所有元素startswith("Dev_")筛选以Dev_开头的项test("_([0-9]{1,3})$")校验元素结尾为下划线加1-3位数字- 最终将符合条件的元素重新组合为数组
测试结果
用你的输入示例测试,两种方法都会输出:
[ "Dev_08346f824a146dafbdca4b63eb3ce0b1549c6346_165", "Dev_0ab8997f5d45ed6b7515b5148d492c98109bf94a_16" ]
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

