LEX中如何在多引号场景下提取首个被引号包裹的匹配单词
问题根源
你当前的处理逻辑和正则使用都存在问题:
- 你的操作逻辑是匹配到目标内容后将其替换为空,再输出整行,自然只能得到删除了目标内容的剩余文本,没匹配到时就会输出完整原句,和「仅输出匹配到的内容」的需求完全相反
- 你写的正则
^\'[a-z]+\'仅能匹配行首位置的单引号包裹小写单词,如果第一个带引号的单词不在行首,会直接匹配失效
解决方案
首先调整正则逻辑,捕获第一个单引号包裹的单词内容,再修改处理逻辑为仅输出捕获到的匹配内容即可,下面是常用命令行工具的实现方式:
1. 使用GNU grep
命令:
# 仅输出单词本身,不带单引号,比如输出 apple grep -oP "^[^']*'\K[a-z]+(?=')" 你的输入文件 # 保留单引号输出,比如输出 'apple' grep -oP "^[^']*'\K[a-z]+'" 你的输入文件
参数说明:
-o:仅输出匹配到的内容,不输出整行-P:启用Perl正则语法^[^']*:匹配行开头到第一个单引号前的所有内容\K:丢弃之前匹配的内容,只保留后续匹配的部分(?='):正向预查,确认单词后面紧跟单引号,不会匹配到其他内容
2. 使用sed
命令:
# 仅输出单词本身,不带单引号 sed -n "s/^[^']*'\([a-z]\+\)'.*/\1/p" 你的输入文件 # 保留单引号输出 sed -n "s/^[^']*\('[a-z]\+'\).*/\1/p" 你的输入文件
参数说明:
-n:默认不输出任何行内容,避免没匹配到时输出原句s/原模式/替换内容/p:将原模式匹配到的内容替换为指定内容后输出- 用括号
\(\)将目标单词捕获为分组1,替换时直接用\1引用分组内容,即可仅输出匹配到的单词
用你的示例输入'apple' banana 'orange'测试上述命令,都会直接输出你需要的apple(或带单引号的'apple')。
内容的提问来源于stack exchange,提问作者user9178840
相关产品推荐
相关产品推荐

