如何用Perl/Sed仅替换数组Item2的空格为下划线并提取指定元素?
用Perl或Sed实现指定文本替换与提取需求
问题场景:运行命令行后得到包含4个元素的数组,示例输入如
ProjectA: i love perl c_iloveperl License: ab123、ProjectB: i_love_perl c_iloveperl License: ab123。各元素对应:Item1=ProjectA:,Item2=i love perl / i_love_perl,Item3=c_iloveperl,Item4=License: ab123。需求是仅将Item2中的空格替换为下划线,最终提取无空格的Item2和Item3(即i_love_perl c_iloveperl)。
方案一:用Perl实现(更直观灵活)
Perl的正则处理能力天生适合这种精准匹配+局部替换的场景,命令行直接就能搞定,不用写脚本文件。
命令示例
假设你的原始命令输出是每行一个数组元素,直接用管道传给Perl即可:
your_original_command | perl -ne ' # 精准匹配行结构,捕获四个关键部分 if (/^(\w+:\s)(.*?)\s+(\w+)\s+(License:.+)$/) { my $item2 = $2; # 只替换Item2里的空格为下划线 $item2 =~ s/ /_/g; # 输出处理后的目标内容 print "$item2 $3\n"; } '
关键说明
-ne参数:n让Perl逐行处理输入,e指定要执行的代码段- 正则表达式
/^(\w+:\s)(.*?)\s+(\w+)\s+(License:.+)$/把每行拆成四个捕获组,精准定位Item2和Item3 s/ /_/g是全局替换,只作用于捕获到的Item2内容,不会影响其他部分
方案二:用Sed实现(轻量无依赖)
如果你的环境里没有Perl,Sed也是靠谱的选择,借助扩展正则和保持空间就能完成需求,不需要额外依赖。
通用兼容版(适配BSD/GNU Sed)
your_original_command | sed -E ' h; # 把当前行暂存到保持空间 # 提取Item2并替换空格为下划线 s/^(\w+:\s)(.*?)\s+(\w+)\s+.*/\2/; s/ /_/g; H; # 把处理后的Item2追加到保持空间 x; # 交换模式空间和保持空间,拿到原始行+处理后的Item2 # 组合成目标格式并输出 s/(\n.*)\n(.*)/\2 \1/; s/^\n//; '
简化版(GNU Sed专属)
如果用的是GNU Sed,可以用e参数直接执行替换命令,写法更简洁:
your_original_command | sed -E 's/^(\w+:\s)([^ ]+ [^ ]+ [^ ]+)\s+(\w+)\s+.*/echo "\2" | tr " " "_" && echo -n " \3"/e'
关键说明
-E参数:启用扩展正则(GNU Sed也可以用-r)- 通用版利用Sed的保持空间暂存原始行,先处理Item2的空格,再和原始行里的Item3组合输出,全程纯Sed内部操作
内容的提问来源于stack exchange,提问作者IAMbeginner
相关产品推荐
相关产品推荐

