如何用Perl单行命令保留_LN\d+_模式与/并删除其他字符?
Perl单行命令实现指定文本过滤需求
需求说明
输入文本格式示例:
U_town/u_LN0_pk_LN3_bnb_LN155/DD0 U_DESIGN/u_LNxx_pk_LN99_bnb_LN151_LN11_/DD5 U_master/u_LN999_pk_LN767888_bnb_LN9772/Dnn111 u_LN999_pk_LN767888_bnb_LN9772_LN9999_LN11/DD ...
需要过滤后仅保留/和符合_LN\d+_模式的内容,输出效果:
/_LN0__LN3__LN155/ /_LN99__LN151_LN11_/ /_LN999__LN767888_/ _LN999__LN767888__LN9772_LN9999_/
失败命令分析
- 第一条命令
perl -pe 's/(?! _LN\d+_)[^\/].+//g' file:负前瞻位置错误,[^\/].+会匹配所有非/的字符序列,结合负前瞻条件不成立,导致所有内容被删除,返回空行。 - 第二条命令
perl -pe 's/(?! _LN\d+_)\w+//g' file:仅处理单词字符,未覆盖非单词字符,且负前瞻未正确匹配_LN\d+_的完整规则,最终只留下/。
正确单行命令实现
无需逐字符解析,以下两种单行Perl命令均可实现需求:
思路1:捕获保留内容,替换其他字符
perl -pe 's/.*?(_LN\d+_|\/)|./$1/g' file
逻辑解释:
.*?(_LN\d+_|\/):非贪婪匹配,优先捕获_LN\d+_或/,将符合要求的内容存入捕获组$1|.:匹配所有未被上述规则捕获的单个字符- 替换时保留捕获组内容,其他字符替换为空,最终只留下需要的内容。
思路2:删除所有不符合要求的连续字符
perl -pe 's/(?:(?!_LN\d+_|\/).)+//g' file
逻辑解释:
(?:(?!_LN\d+_|\/).)+:匹配连续的、每个字符都不处于_LN\d+_或/开头位置的字符序列- 直接删除这些序列,留下符合要求的内容。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

