3

コメント内で、1行に複数の一致がある大量の文字を置き換えています。これにより、タイトルに記載されている問題が軽減されます。Perlワンライナーでこれを行う簡単な方法はありますか?私がこれまで考えてきた最も簡単な方法は、次のようなことをすることです。

perl -pi e 's/(.*regex1.*)(regex2)/$1replacement/' filename

ファイルの変更が停止するまでこれを実行するだけです。このためにワンライナーを行うためのより良い方法があるに違いないようです。

入力例(列の数はファイルによって異なります):

   /*
    * name     val1     val2
    * foo      2345     23
    * barbaz   34       23456
    */

出力例:

   /*
    * name.....val1.....val2
    * foo......2345.....23
    * barbaz...34.......23456
    */
4

1 に答える 1

2

次のようなことを試すことができます:

perl -pwe 'if (m#/\*# .. m#\*/#) { 
    s/\w\.*\K( {2,})(?=\S)/ "." x length($1) /eg; }' input.txt > output.txt

ただし、コメントを正規表現と一致させるのは難しい作業であることに注意してください。コメントがシンプルなスタイルに従っている限り問題ありませんが、他のコメントと一致しないように注意してください。

このワンライナーでは、フリップフロップ演算子を使用して、オープン コメント記号とクローズ コメント記号を一致させます。内部では、オプションのピリオドが続く任意の英数字に一致し、\wその後に続くスペース (2 つ以上) をピリオドに置き換えます。最後の先読みは、最後の単語の後にピリオドが追加されるのを防ぐためにあります。foo....bar.....

( +)スペースのみをキャプチャするために使用することを選択しましたが、それを に置き換えることができます(\s+)。ただし、インデントを維持したい場合は、タブをピリオドに置き換えるのは非常に面倒です。

到着予定時刻:

-i複数のファイルを処理する場合に便利な、ファイルのインプレース編集を実行するオプションを利用したい場合があります。安全な方法は、バックアップを使用することです-i.bak

于 2012-06-07T00:16:51.687 に答える