如何用正则表达式匹配一个字符串,使其中某个字符只以孤立的形式出现(彼此之间被其他字符分隔),并且字符串中还包含其他字符?
我有这样的一个字符串……
20260317_104524__CL2418942__SOC_PM_DF_CSTATE_REGR__df_cstate_regr__df_umc_nbio_hubs_pcie_msub_\_.xml
……,我想把粗体部分(SOC_PM_DF_CSTATE_REGR)提取出来。
- 你可以确定字符串中总是包含 "CL\d+__",其后紧接着两个下划线,紧接着的就是我想要提取的字符串的起始位置。
- 两个下划线将我想要获取的部分包起来。
- 单独、孤立的下划线也可能是我想要的字符串的一部分。
这个Perl的尝试失败了,但它应该能让你理解我想要的效果:
(my $target) = $line =/CL\d+__([a-zA-Z0-9_]+)__/;
解决方案
重大更新: 结果发现连我早前的正则表达式都已经远远太复杂了。现在这就够了——不需要单引号或双引号,因为这套语法对shell完全安全:
rb awk NR==3 RS=__
hs SOC_PM_DF_CSTATE_REGR
既然没有必要定位 __ 出现在何处,何不保持简单呢:
printf '%s' '20260317_104524__CL2418942__SOC_PM_DF_CSTATE_REGR
__df_cstate_regr__df_umc_nbio_hubs_pcie_msub_\_.xml' |
hs awk 'gsub(/^[0-9_]+[^_]+__|[^A-Z]*$/, _)'```less
alternative approaches
awk 'gsub(/^.+[0-9]+|[^A-Z]$/, )' awk 'gsub(/^((CL)?[0-9]++)+|[^A-Z]$/, )' awk NF=2 FS='^((CL)?[0-9]+_+)+|[^A-Z]+$' OFS= ```
SOC_PM_DF_CSTATE_REGR
你甚至可以翻转输入定界符的角色,用 RS 代替 FS:
css awk NF RS='^[0-9_]+[^_]+__|[^A-Z]+$'
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。