如何使用grep仅提取分号与双引号之间的目标内容?
解决grep提取分号与双引号间内容时去除边界符号的问题
嘿,我刚好能帮你搞定这个小问题!你之前用grep -oP ';.*?"' file提取的内容带了开头的;和结尾的",是因为你的正则把这两个边界字符也包含在匹配范围里了。咱们调整一下正则,就能只拿到中间的目标内容啦。
方法一:用grep的正向预查/后查(推荐)
直接修改正则,使用正向零宽断言来排除边界符号:
grep -oP '(?<=;).*?(?=")' file
正则解释:
(?<=;):正向后查,确保当前位置前面是分号;,但不会把分号包含在匹配结果里.*?:非贪婪匹配任意字符(直到遇到第一个双引号为止,避免匹配过多内容)(?="):正向预查,确保当前位置后面是双引号",同样不会把引号包含在结果里
执行这个命令后,你就能得到完全符合期望的输出:
8pctgRB Mwdf fgEio 8pctgRBwsaNezxio 8pctgsvMALNejkio 8pctgxdfALNebfio 8pwerRBMALNetior
方法二:用sed做替换提取
如果你更习惯sed,也可以用替换的方式提取目标内容:
sed -E 's/.*;(.*?)".*/\1/g' file
命令解释:
.*;:匹配到行内第一个分号之前的所有内容(.*?):捕获分号到第一个双引号之间的内容(非贪婪匹配)".*:匹配双引号之后的所有内容\1:把整行替换成刚才捕获的分组内容,只保留我们需要的部分
两种方法都能达到你想要的效果,选你顺手的就行~
内容的提问来源于stack exchange,提问作者Le Thuan
相关产品推荐
相关产品推荐

