0

示されているようなファイルがあります

    ford
    speed ....
    hyundai
    speed ...
    ferrari
    speed ....
    BMW
    Merc
    lambo
    speed ...

2 行目から 1 行おきに「速度」を検索し、見つからない場合は「速度\n」を追加します。つまり、出力を

        ford
        speed ....
        hyundai
        speed ...
        ferrari
        speed ....
        BMW
        speed
        Merc
        speed
        lambo
        speed ...

上記の問題に使用できるワンライナーはありますか?

perl -ple 's/^/speed/' filename
4

4 に答える 4

3
perl -plne 'if($.%2==0){unless(/speed/) {print "speed";$.++;}}' your_file

テスト済み:

> cat temp
ford
speed ....
hyundai
speed ...
ferrari
speed ....
BMW
Merc
lambo
speed ...
> perl -plne 'if($.%2==0){unless(/speed/) {print "speed";$.++;}}' temp
ford
speed ....
hyundai
speed ...
ferrari
speed ....
BMW
speed
Merc
speed
lambo
speed ...
> 
于 2012-09-18T11:52:54.793 に答える
1

perl -peはこの場合に固執しますが、次の両方の場合に余分な「速度」行を出力する必要があります。

  • 奇数行が印刷されました
  • 現在のものは /speed/ ではありません

つまり... ($odd = (これまでに印刷された行数) % 2)

perl -pe 'next if ($odd ^= 1 or /^\s*speed/); print "speed\n"; $odd ^= 1; '

更新: -n/-p の仕組みが原因で、ファイルの最後の行が正しく処理されませんでした。そのため、END ブロックを追加しました。「奇数行で停止した場合は、速度を追加します」.

perl -ple 'chomp; next if ($odd ^= 1 or /^speed/); print "speed"; $odd ^= 1; END { print "speed" if $odd }'

それは1行半であり、現在は1行ではありません=)

于 2012-09-18T12:44:10.897 に答える
0

ここに別のアイデアがあります:

perl -ne 'print "speed\n" if ( $v = !m/^\s*speed\b/ and $no_speed ); print; $no_speed = $v'
于 2012-09-18T13:50:49.427 に答える
-1

行番号は$.

したがって、1 つのライナーの 2 行ごとに何らかのアクションを実行する必要がある場合は、次のようにすることができます。

perl -ple 's/^/speed/ if $. % 2 == 0' filename

% operator direclty の結果をブール値として解釈すると、次のように縮小できます。

perl -ple 's/^/speed// if !($. % 2)' filename

に関するドキュメントについては、perlvar のマニュアルページを読んでください。$.

于 2012-09-18T11:14:19.107 に答える