如何解析特定列数据且不丢失其他行列内容?支持大小写不敏感精确匹配
实现方案
方案1:GNU grep 实现(Linux环境默认适用)
使用如下命令即可满足需求:
grep -i -P "(?<![a-zA-Z0-9])${pd}(?![a-zA-Z0-9])" input_file
参数说明
-i:开启大小写不敏感匹配,适配输入lg匹配LG的需求-P:启用Perl兼容正则语法,支持环视匹配规则(?<![a-zA-Z0-9]):负向后顾断言,要求匹配值$pd的前一位不能是字母或数字,避免匹配0225、11225这类前缀带其他字符的内容(?![a-zA-Z0-9]):负向前瞻断言,要求匹配值$pd的后一位不能是字母或数字,避免匹配2250这类后缀带其他字符的内容
效果验证
- 当
pd=225时,输出结果:
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore
- 当
pd=lg时,输出结果:
10.20.223.10|2000-H1|1/1/2|DeviceX_4021|LG 10.20.225.10|2000-H1|1/1/5|DeviceZ_2050|LG
完全符合预期,且不会修改原行内容,不会丢失行列有效信息。
方案2:awk 实现(全平台兼容,适配无GNU grep的环境如macOS)
如果你的环境不支持GNU grep的-P参数,可以用兼容性更强的awk实现:
awk -v pat="${pd}" 'BEGIN{IGNORECASE=1} {if($0 ~ "(^|[^a-zA-Z0-9])" pat "([^a-zA-Z0-9]|$)") print}' input_file
内容的提问来源于stack exchange,提问作者Javier Gonzalez
相关产品推荐
相关产品推荐

