输入:
F1 F2 F3 F4 F5 F6
4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123
输出:
4 ABCDEF1234 1111111111 20090101-00:00:00 XYZ 123
F 代表字段。F4 和 F5 是需要用连字符连接的日期字段。是否有一个快速的 Perl 脚本可以做到这一点?
输入:
F1 F2 F3 F4 F5 F6
4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123
输出:
4 ABCDEF1234 1111111111 20090101-00:00:00 XYZ 123
F 代表字段。F4 和 F5 是需要用连字符连接的日期字段。是否有一个快速的 Perl 脚本可以做到这一点?
s/(\d{8})\s+(\d{2}:\d{2}:\d{2})/$1-$2/
输入看起来有点像固定宽度-y,这表明pack
和unpack
。
my @F = unpack( 'A4 A11 A11 A19 A7', $input_line );
$F[3] =~ s/\d\K\s+/-/; # Use lookaround (?<=\d) if \K is not available
my $line = pack( 'A4 A11 A11 A19 A7', @F );
再说一次,如果它足够固定,你可以去:
substr( $input_line, 34, 1, '-' );
printf("%-4s%s %s %s-%s %s\n", $F1, $F2, $F3, $F4, $F5, $F6);
此答案假定字段已拆分为变量 $F1 .. $F6。如果数据是单个字符串,则正则表达式答案更合适。
如果格式是固定列宽:
perl -pe'substr$_,34,1,"-"'
否则类似:
perl -ane'printf"%-4s%s %s %s-%s %s\n",@F'
$str = "4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123";
@s = split /\s/,$str;
$s[5] = join("-",$s[5],$s[6]);
splice(@s,6,1);
print join(" ",@s);
直接在命令行中:
$ perl -n -e '@fields = split; printf "%s %s %s %s-%s %s %s\n", $fields[0], $fields[1], $fields[2], $fields[3], $fields[4], $fields[5]' input.txt > output.txt
请记住,这等效于 put:
#!/usr/bin/perl -w
while (<>) {
@fields = split;
printf "%s %s %s %s-%s %s %s\n", $fields[0], $fields[1], $fields[2], $fields[3], $fields[4], $fields[5];
}