如何用Perl单行命令拆分首列生成多行并保留次列内容?
解决方案
直接用Perl的split拆分字段比纯正则替换更可靠,毕竟你的需求是拆分而非简单替换,单行命令可以这么写:
perl -pe 'my ($parts, $tag) = split /\t/; $_ = join "\n", map "$_ $tag", split /_;_/, $parts' test
命令细节说明:
split /\t/:把每行按制表符拆成两部分,第一部分是待拆分的字符串(比如cat_;_dog_;_rat),第二部分是要保留的关联标签(比如animal)。split /_;_/, $parts:把第一部分按_;_拆成单独元素的数组(比如("cat", "dog", "rat"))。map "$_ $tag", ...:遍历数组,将每个元素和标签拼接成独立行内容。join "\n", ...:把所有拼接好的行用换行符连接,替换掉原来的整行内容。
你之前的正则失效原因:
你尝试的正则用了+重复捕获,但Perl正则里的分组在重复匹配时,只会保留最后一次匹配的内容,没法一次性捕获所有拆分后的元素。用split直接拆分逻辑更直观,还能处理任意数量的_;_分隔符。
如果要处理管道输入,直接去掉文件名换成管道即可:
cat test | perl -pe 'my ($parts, $tag) = split /\t/; $_ = join "\n", map "$_ $tag", split /_;_/, $parts'
内容的提问来源于stack exchange,提问作者CGanote
相关产品推荐
相关产品推荐

