タグ付けされた質問 「substitute」

ex-modeの `:s`コマンドなど、テキストの正規表現ベースの置換を伴う操作。[replace]タグと混同しないでください。

3
純粋なvimscriptで置換( `:s`なし)
私は私のvimrcに以下を持っています: func! AddSpaceBeforeEqual() s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge endfunc vimrcのlintにvintを使用していて、次の警告が表示されました。 ProhibitCommandWithUnintendedSideEffect 意図しない副作用のあるコマンドを回避します。:s [ubstitute]を使用すると、カーソルが移動してエラーメッセージが出力されるため、使用しないでください。スクリプトにより適した関数(search()など)を優先します。多くのvimコマンドには、副作用が少なく同じことを行う関数が存在します。組み込み関数のリストについては、:help functions()を参照してください。Google Vimscriptスタイルガイド ただし、:sコマンドを使わずに置換を行う方法だとは思いません。 たとえば、search()関数はパターンに一致する行を提供しますが、置換を行う方法はありません。このsubstitute()関数は文字列を操作し、ファイル全体を置き換えません。 自分で代替メソッドを実装する必要がありますか、それとも私の関数を書き換えるよりスマートな方法ですか?

1
Vimのグローバル置換が行のすべての一致を代用するわけではありません
時々、私のグローバルな置換が一列のすべてのマッチを代用しない場合があります。確認で置換を行うと、それが見えることが確認され、一致する可能性のある複数の行で一致が見つかりましたが、別の行に進みます。 ファイル全体を操作するgまたはgcパラメータをで使用しています%。 このファイルについて: hello hello hello hello hello hello hello もし私が%s/hello/goodbye/g得るなら goodbye hello goodbye goodbye hello hello goodbye 私が.vimrc検索/置換について持っているのは set hlsearch set ignorecase set incsearch
12 substitute 

11
オンラインで2番目の出現を置換
ファイルのリストがあります: ./a.temp.txt ./a.temp.txt ./a/b.temp.txt ./a/b.temp.txt ./a/b/c.temp.txt ./a/b/c.temp.txt そしてtemp.、各行のを削除したいのですが、2番目の出現だけなので、ファイルは次のようになります。 ./a.temp.txt ./a.txt ./a/b.temp.txt ./a/b.txt ./a/b/c.temp.txt ./a/b/c.txt どうすればよいですか?

1
複数行で置き換えるには?
単語を複数行に挿入したいのですが、次のようなコマンドはありますか :[2,3,5,7,11]s/^/word\ /g word2行目、3行目、5行目、7行目、11行目の最初に挿入するのはどれですか。 ここでは、複数の線が連続していません。

6
ファイルの最後にまだ行がない場合にのみ、行を追加する方法は?
行を追加してインプレースでファイルを編集したいのですが、まだ存在しない場合に限り、スクリプトを完全なものにします。 通常、私は次のようなことをします: cat >> ~/.bashrc <<EOF export PATH=~/.composer/vendor/bin:\$PATH EOF ansible(line+ insertafter=EOF+ regexp)を介してそれを行うことも可能ですが、それは別の話です。 vi / exでは、次のようなことができます。 ex +'$s@$@\rexport PATH=\~/.composer/vendor/bin:$PATH@' -cwq ~/.bashrc しかし、理想的には同じ行を繰り返さずに、行が既に存在する(したがって何もしない)かどうかを確認するにはどうすればよいですか? それともExエディタでそれを行う簡単な方法がありますか?

4
操作をコードのセクションに制限する
日常業務の中で、特定の関数(変数の強調表示や検索など)を操作する必要があることがよくありますが、編集/検索の範囲を制限することはできませんでした。 vimで、$colorこれらの中括弧のセットへのすべての参照、またはこの折り目などを選択的に言う方法があります。可能であれば、これは比較的一般的で、テキストの編集/置換に適用できるのが理想的です。 例として: $color = "#fff"; function PickColor () { $color = "#bbb"; $newColors = ["#000", "#fbf", $color]; foreach ($newColors as $c) { if ($c == "#fff") { break; } } } $differentColor = $color; このコードは比較的悪い例ですが、$ colorのすべてのインスタンスを置き換える必要がある場合、PickColor関数のコンテキストでこれをどのように行うのでしょうか。別の例として、使用する#と、*あなたはそのテキストオブジェクトの次のインスタンスに移動することができ、どのように(基本的には、検索をラップする)だけで、この機能の検索のための範囲を制限する行の数千人に及ぶ可能性がファイル全体に反対して負けあなたの場所、またはあなたが持ってはならない別の機能の何かを誤って置き換えますか?


1
置換コマンドのプレビューを取得するにはどうすればよいですか?
かなりの頻度で、大きなファイル全体で一致がまばらになり、自明ではない検索式と置換式を使用する置換を実行する必要があることに気付きます。 たとえば、のような関数呼び出しがあるとしokFunction(arg1, arg2 arg3)ます。もちろん、引数は関数呼び出しごとに異なります。今、私は必要としないより良い機能を発見したと言いますarg2。ファイル全体を簡単に調整できます :%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc 概念的には単純ですが、このかなり長いパターンで構文が正しいかどうかはわかりません。cフラグは本当にここに役立ちますが、問題は、確認を求めたとき、Vimはマッチが置き換えられますどのような表示されませんということです。つまり、置換式は表示されますが、評価結果は表示されません。で置換を確認するとy、vimはすぐに次の試合にジャンプし、間違いを犯したかどうかを確認することはできません。 問題を部分的に解決するvim-overプラグインを見つけましたが、コマンドを入力しているときに画面にすべてのマッチが表示されている場合のみです。Enterキーを押すと、動作は上記の説明とまったく同じになり、プレビューは表示されません。 それで、代替コマンドで確認を求めるときにvimに置換式を評価させる方法はありますか?


1
単一のキーストロークで、異なる選択に対して以前の置換を実行します
次のコマンドを実行しました :'<,'>s/2/digit/g 手動で視覚的に選択された以下のコード: return _.round(this.getTotalAbs(), 2).toFixed(2); そしてそれは意図したように機能しました return _.round(this.getTotalAbs(), digit).toFixed(digit); ここで、ビジュアル選択モードを介して手動で選択した別のコードスニペットに対して、1つのキーストローク(可能な場合)で同じ置換コマンドを繰り返したいと思います。



2
レジスタで置換を使用するにはどうすればよいですか?
文字列が格納されているものを登録したとしましょう。ただし、置換コマンドを使用して変更したいとします。 たとえば、5x5のhtmlテーブルがあります。 let @t='<table>'.repeat('<tr>'.repeat('<td>_</td>',5).'</tr>',5).'</table>' そして、プレースホルダー(_)を既存のレジスターを変更する(別のレジスターに割り当てるのではなく)ことによって理想的には他のデータに置き換えたいと思います。 私は次の構文を試しました: "ts/_/test/g "@ts/_/test/g " with modifiable set エラーは発生しませんが、期待どおりに機能しません(prefixが%機能するのと同じように)。 それを行う適切な方法は何ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.