3

いくつかの HTML 編集に基づいて、VIM マスターからの助けが必要であると思いつきました。

単純なタスクを達成したくありません-URLが壊れたhtmlファイルがあります。

<a href="http://some/wrong/url with variable number of spaces">Just description</a> <a href="http://some/wrong/url with three spaces">Just description</a>
...
<a href="http://anoter/wrong/url with completely other number of spaces">Just description</a>

残念ながら、「1行に1つのURL」ではありません。

私は3つのアプローチを認識しています:

  1. 正規表現内でのみ置換できるようにしたいと思います'"http://[^"]*"'(一致する行のみを置換するのと同様ですが、今回は行全体ではなく、一致するパターンのみを含める必要があります)

  2. または、sed のようなラベルを使用します。このタスクは sed -e :a -e で実行できます。's#\("http://[^" ]*\) \([^"]*"\)#\1_\2#g;ta'

  3. また、次のようなものがあることも知っていますが"\@<="、私はネイティブスピーカーではなく、これに関するvimマニュアルは私の理解を超えています。

すべてのヘルプは大歓迎です。

可能であれば、3 つの問題すべての回答を知りたいのですが (これらは非常に興味深いものであり、他のタスクに役立つため)、どちらでも構いません。

4

2 に答える 2

3

:h :s\=Re: 1. vim の「置換を式として評価する」機能 ( ) とsubstitute関数 ( :h substitute())を組み合わせることで、再帰的に置換できます。

:%s!"http://[^"]*"!\=substitute(submatch(0), ' ', '_', 'g')!g

Re: 2. わからないsedので、それについてはお答えできません。

\@<=Re: 3.ここでどう役立つかわかりません。(?<=...)それが何をするかについて: これは、「肯定的な後読み」としても知られるPerl の機能と同等です。「前にある場合」と読むことができます:

:%s/\%(foo\)\@<=bar/X/g

bar「」が前にXある場合は「」に置き換えますfoo。つまり、すべてfoobarを「」に変換しますfooX(これら\%( ... \)はここでグループ化するためだけのものです)。Perl では、次のように記述します。

s/(?<=foo)bar/X/g;

その他の例と説明は、 にありperldoc perlretutます。

于 2013-01-14T12:13:37.113 に答える
1

あなたがしたいことは、 http:// url のすべてのスペースを に置き換えることだと思います_

目標を達成するために、@melpomene の解決策は簡単です。あなたのvimでそれを試すことができます。

一方、sed 回線をシミュレートしたい場合は、以下を試すことができます。

:let @s=':%s#\("http://[^" ]*\)\@<= #_#g^M'

^M means Ctrl-V then Enter

それから

200@s

これは sed 行と同じように機能し (ラベル、置き換え、ラベルに戻る...)、@<=同様に使用されました。

1 つの問題は、この方法では、すべての一致パターンがいつ置換されたかを vim が検出できないことです。したがって、比較的大きな数 (私の例では 200) が与えられました。そして最後に、「E486: パターンが見つかりません...」というエラー メッセージが表示されます。

メッセージを回避するには、スクリプトが必要です。

于 2013-01-14T14:07:37.163 に答える