正規表現を使用して検索および置換

ユーザーのデフォルトが多数含まれているファイルがあります。テキストの一部を変更したいのですが、苦労しています。マッチャーとリプレースメントを考え出します。次の例を使用します。

############################################################################### # Trackpad, mouse, keyboard, Bluetooth accessories, and input # ############################################################################### # Trackpad: enable tap to click for this user and for the login screen defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true 

# Trackpad: ...を置き換えたいrunning "Trackpad: ..."

問題を解決して、正規表現テスターを使用して何かを思いついた:

/\n\n#\s(.*)/g 

Vimでこれを使用しようとすると、機能しません:

:/\n\n#\s(.*)/running "\1"/g 

問題は2つの特定の質問に要約されると思います。

  1. \n文字の検索を回避し、代わりに#が表示されないようにするにはどうすればよいですか。検索グループの最後にありますか?
  2. キャプチャグループを効果的に使用するにはどうすればよいですか?

以下にいくつかの優れた回答があります。 3つすべてから選択するのは難しいですが、選択した答えが私の元の仕様に対して最も正確であると感じています。 実際のファイルで3つの回答すべてを試して、それらについてどのように感じているかを確認することをお勧めします。

回答

明確にするために…これは置換の結果であるとあなたが求めたと思いますか?

############################################################################### # Trackpad, mouse, keyboard, Bluetooth accessories, and input # ############################################################################### running "Trackpad: enable tap to click for this user and for the login screen" defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true 

その場合は、次のコマンドをお勧めします。

:%s/\n\n#\s\+\(.*\)/^M^Mrunning "\1"/

パターンの説明

:s/PATTERN/REPLACEMENT/代替コマンドです。 :%sのパーセント記号を使用すると、現在の行だけでなく、ファイル全体で機能します。

\n\nは、関心のある行が空白行の後にある必要があることを示しています。前の空白行を気にしない場合は、^で十分です。

#\s\+はハッシュと一致します文字の後に1つ以上の空白文字が続きます。\(.*\)は、行の後続のすべてのテキストをキャプチャします。

置換テキストの説明

^M^Mは、行の両端を挿入して、パターンに存在していた\n\nを置き換えます。そうしないと、テキストが行の終わりに移動します。空白行の前。各^Mを入力するには、 Ctrl-V Ctrl-M を押します。

次に、文字列runningを挿入し、その後に二重引用符で囲まれた括弧内にキャプチャされたものを挿入します。

コメント

  • 回答を編集できませんが、:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/(" magic フラグ)。選ぶのは本当に難しいです私の元の質問に対する正解ですが、この回答は私の元の予想される回答に最も近いと思います。また、範囲を選択せずにファイル全体で機能するのはこれだけです。
  • IIRCでは、iv id = “の代わりに\rを使用できます。 c63256aa19 “>

新しい行を取得しますか?

回答

次のようなものを使用します:

:s/^#\s\+\(.\{-}\):/running "\1":/ 
  • ^#は、アンカーされた#文字と一致します行の先頭(これは質問1に回答します)
  • \s\+任意の空白に1回以上一致する
  • \(グループを開始します(これは質問2に回答します)
  • .\{-}\は、任意の文字に0回以上一致します貪欲でない方法;これは、.*とは異なり、一致をできるだけ少なくし、できるだけ多くは一致させようとしません。コメントに:文字を追加して、これが重要である理由を確認してください
  • \)サブグループを終了します。
  • :はリテラル:

と一致します次にこれをテキストに置き換えます必要に応じて、\1を使用してキャプチャしたグループを参照します。

を使用して何かを思いついた正規表現テスター

正規表現の構文はwiki構文に少し似ています。それらはたくさんあり、一見するとすべて同じように見えますが、どれも似ていません。明らかに他のどの正規表現よりも優れていますが、多くの違いがあります。

今日、いわゆる「Perl互換」正規表現はほとんどの言語で事実上のデフォルトですが、Vim正規表現はそうではありません。 Perl互換表現と互換性があります! Vim regexp構文は、Perlが存在していなかったとき、少なくとも「70」に戻ります。

これは、\(ではなく((これは、POSIXの「基本」構文と互換性がありますが、より一般的なPOSIXの「拡張」構文またはPerl構文とは互換性がありません)。これを制御するには、パターンに\vフラグを追加します( :help /\v <を参照してください。 / a>詳細)、これにより「互換性が向上」しますが、完全ではありません(たとえば、貪欲でない一致には.{-}を使用する必要があります)

したがって、これは「正規表現テスター」の使用がほぼ機能する理由を説明している可能性がありますが、完全ではありません。

http://www.vimregex.com/ Vimregexpsの概要/チートシートとして。

コメント

  • 特に、なぜregex!= regexなのかという点で優れた回答です。検索と置換については、コメントに:がある場合とない場合があるため、'は少し注意が必要です。詳細については、ファイル全体を参照してください github.com/squarefrog/dotfiles/blob/master/osx/ …

回答

次のことができます:

  • 終了しない行を検索する#:/[^#]$/
  • の先頭にある#\s(.*)を置き換えます次の行:s/\v^#\s(.*)/running "\1"/

グループを使用するには、次のいずれかを行う必要があります。

  • 角かっこをエスケープして次のようにします。これらは正規表現構文の一部になります:\(.*\)、または
  • “magic” を使用式を\vで始める:s/\v...

組み合わせ:

:/[^#]$/s/\v^#\s(.*)/running "\1"/ 

コメント

  • これは、必要なテキストだけでなく、タグの意味の説明を含めてくれて、見事に機能します。書き込みます。
  • 角かっこにtがあることを明確にしていただきありがとうございますo正規表現構文の一部になるためにエスケープされます。正規表現グループを機能させる上で、常に問題がありました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です