2

入力:

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 スクリプトはありますか?

4

6 に答える 6

4
s/(\d{8})\s+(\d{2}:\d{2}:\d{2})/$1-$2/
于 2009-07-21T06:52:16.827 に答える
3

pack入力は一種の固定幅 y のように見えます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, '-' );
于 2009-07-21T08:50:45.873 に答える
3
printf("%-4s%s %s %s-%s  %s\n", $F1, $F2, $F3, $F4, $F5, $F6);

この回答は、フィールドがすでに変数 $F1 .. $F6 に分割されていることを前提としています。データが単一の文字列である場合は、正規表現の回答がより適切です。

于 2009-07-21T06:51:54.473 に答える
1

フォーマットが固​​定列幅の場合:

perl -pe'substr$_,34,1,"-"'

それ以外の場合は次のようになります。

perl -ane'printf"%-4s%s %s %s-%s  %s\n",@F'
于 2009-07-22T11:10:41.840 に答える
1
$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);
于 2009-07-21T07:05:14.120 に答える
0

コマンドラインで直接:

$ 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];
}
于 2009-07-21T17:12:15.367 に答える