2017-12-28 50 views
1

コードファイル内で、連続した白い線(ゼロ個以上の空白/タブと改行を含むことができる行)をコード間で移動して削除したいテキストとブロックの}という結論に達しました。この結論は}の前にインデントのためのスペースがあるかもしれないので、私はそれらを保持したいと思います。ここでPerl:正規表現:キャプチャグループ

は私がやろうものです。たとえば

perl -i -0777 -pe 's/\s+\n([ ]*)\}/\n($1)\}/g' file 

、私のコードファイルがどのように見える場合(□空白文字がある):

□□□□while (true) {\n 
□□□□□□□□print("Yay!");□□□□□□\n 
□□□□□□□□□□□□□□□□\n 
□□□□}\n 

は、その後、私はそれがなりたいです:

□□□□while (true) {\n 
□□□□□□□□print("Yay!");\n 
□□□□}\n 

しかし、私は期待した変更を行いません。私がここで間違っていることは何ですか?

+0

正規表現は、おそらくこれに適したツールではありません。あなたのIDEがこのように書式を整えると、それはパーサを使用しています(また、コンパイル中でもあります)。 –

+0

@TimBiegeleisen私はすべてのコメントを削除するスクリプトを通してファイルを実行するので、私はこれらのケースを時々得ます。だから私は同じスクリプトでそれをきれいにしたいと思います。 – rapt

+2

あなたのコードはperlですか?それから私はperltidyを取得し、それを使用することをお勧めします。 – Sobrique

答えて

0

代わりにこの正規表現を使用してください。この正規表現は、肯定的な先読みアサーションを使用します。この方法であなただけ削除したい部分をキャプチャして、何もそれを置き換える:

s/\s+(?=\n[ ]*\})//g 
+0

ほとんどのところ - '\ n'を先に移動しなければならないと思います。さもなければ、それは削除されます。 – rapt

+0

ああ、ありがとう!更新しました。 – Marathon55

-1

あなたが試すことができ

perl -0777 -pe 's/\s*\n*(\s*\n)/$1/g' test 
+0

ほぼそこにありますが、 '}'の直前にない他の白い行も削除されます。 – rapt

1
perl -pi -0777 -e's/^\s*\n(?=\s*})//mg' yourfile 

は(最初から空白を削除し、次の1つのライナー空白以外の最初の空白として}の行に先行する改行を通る行の数)

1

あなたの正規表現で見ることができる唯一の問題は、

です試合を抽出する際、あなたが と
  • 、文字クラスの使用をマッチング変数の周りの括弧は必要ありません0
    • は 冗長(あなたは、タブだけでなく、スペースを一致させたい場合を除く)です。

    だから、あなたの代わりに

    s/\s+\n(*)\}/\n$1\}/g 
    

    を試みることができます。

    これは、テスト入力を実行したときに正常に動作します。

    さらに整理するには、次の方法を試してみてください。

    s/\s+(\n *\})/$1/g 
    

    タブとスペースがある場合は、文字クラスを使用できます。 (文字クラスの中に '|'を入れる必要はありません)。

    s/\s+(\n[ \t]*\})/$1/g 
    
  • +0

    グループを広げていただき、ありがとうございました。私は '$ 1'を使うときにカッコで歪ませてはいけないと分かりました。 :)私の場合、インデントがタブで行われていることに気づいていないので、あなたのバージョンと組み合わせて、s/\ s +(\ n [| \ t] * \})/ $ 1/ – rapt

    +0

    @rapt:こんにちは。交替メタ文字は必要ありません。文字クラスの内部にある。だからおそらく 's/\ s +(\ n [\ t] * \})/ $ 1/g'で十分でしょう。がんばろう。 –

    関連する問題