我有一个输入文本文件input.txt,如图所示
a,2,3*b,4,5*c,7,3*
我必须按如下方式打印数字
a,2,3
b,4,5
c,7,3
为什么你认为正则表达式会有所帮助?做起来容易得多
tr '*' '\n' <input.txt
如果您需要 Perl 解决方案,
perl -pe 'y/*/\n/' input.txt
您可以使用以下正则表达式
/[^*]/
您可以为此使用拆分:
my $string = "a,2,3*b,4,5*c,7,3*";
my @substr = split(/\*/, $string);
{
local $, = "\n";
print @substr;
}
输出:
a,2,3
b,4,5
c,7,3
您输入的记录由*
? 我们可以将输入记录分隔符 $/
设置为该值!
local $/ = "*";
while (<>) {
chomp;
print $_, "\n";
}
单线示例:
$ printf 'a,2,3*b,4,5*c,7,3*' | perl -lpe'BEGIN{$/="*"}'
a,2,3
b,4,5
c,7,3
(-l
自动chomp
输入,并将输出分隔符附加到输出。-p
循环输入的所有记录,执行代码并打印 的值$_
。我们自己不处理行,只需将记录分隔符从 更改*
为\n
。 )
只要原始数据不包含换行符,这就可以正常工作:这些都是未经修改的。替换将s/\n//g
在很大程度上解决这个问题。
你也可以试试这个:
my $data = "a,2,3*b,4,5*c,7,3*";
my $data2 = substr($data, 0, LengthOfSampleInputStringHere - 1);
my @values = split('*',$data2);
# Print and verify (Optional)
foreach my $val (@values)
{
print "${val}\n";
}
编辑
你也可以使用这个正则表达式:
/([^\*]+)/
$string =~ s/\*/\n/g;
应该为你做所有内联的替换