ファイルの2つのパターン間のコンテンツを置き換える方法は?


9

ファイルの形式は次のとおりです。

<common>
fitnes=0
genetic=1
method=0
</common>
<inputs>
foo=bar
bar=foo
</inputs>
<limits>
balance=200.00
</limits>

との間にあるものをすべて削除<inputs></inputs>(パターンit-selfを除く)、別のファイル(例:)のコンテンツに置き換えますfoo.txt。言い換えるとfoo=barbar=fooと行が別のコンテンツに置き換えられます。

おそらく、次のように、複数行の一致削除する方法に似ています。

:g/<inputs/,/inputs>/d

しかし、別のファイルのコンテンツを挿入するためにを置き換える必要があるはわかりませんdが、一致するパターンを保持したいと思います。

同様の方法は、htmlタグの内部コンテンツ削除することです。

:/<inputs>/norm vitd

しかし、ファイルのコンテンツをそれにどのように追加するかわかりません。

ライナーは別のスクリプトの一部になるため、理想的には1つのライナーを見つけようとしています。

どうすればそれを達成できますか?

回答:


10

置換を使用して、次のような式の結果でパターンを置き換えることができます。

:keeppatterns %s;<inputs>\zs\_.\{-}\ze</inputs>;\=insert(readfile('test.txt'), '')

見る :help sub-replace-expression

コマンドが検索履歴に何も追加しkeeppatternsないようにしsubstitute、「最後の検索パターンレジスタ」を保持することに注意してください-を参照してください:help "/。これは、不必要にコマンド修飾子でVimのグローバルな状態を変更することからスクリプトを防ぐために良い習慣だkeepaltkeepjumpslockmarkskeepmarks、とkeeppatterns


5

ゲイリーからの代替アプローチはこれです:

:g/^<inputs>/+,/^<\/inputs>/-d|-r dummy

:rコマンドを使用してファイルダミーからデータを読み取るよりも、最初に指定されたパターンのすべてを削除します。ここで、<input>/</input>パターン間の行からファイル名を抽出する必要がある場合、少し複雑になります。


4

これは、少なくともUnixシステムでは機能するようです。

:/<inputs>/+1,/<\/inputs>/-1!cat foo.txt

{range}!{filter}コマンドを使用して、外部プログラムを通じて行を1 <inputs>つ前から1つ前にフィルタリングします。この場合、はその標準入力を無視するため、元の行は削除され、ファイルの内容に置き換えられます。</inputs>cat foo.txtcatfoo.txt

見る:

:help :range!
:help cmdline-ranges

2

マクロの方が簡単だと思います。特に、同じことをする場所がたくさんある場合。

  1. これら2つのファイルのみを開いたままにします。
  2. 最初のファイルでqa,aがレコード名)で記録を開始します。
  3. 開始パターンを検索し、を押し、次にCtrl- を押しv、終了パターンを検索し、上を押します。削除したいパーツを選択します。消して。
  4. maaはマーク名)を使用して位置をマークし、ファイルを保存します。
  5. :b2コマンドで2番目のファイルに移動し、同様に開始/終了基準に従ってパーツを選択します。
  6. このファイルプレスaに戻って、そのポイントに移動します。そこに貼り付けpます。
  7. 終了基準をもう一度検索し、セクションにまたがらないようにしてください。
  8. を押して記録を終了しqます。
  9. の回数だけを繰り返し40@aます。

1
提案をありがとう、それで結構ですexが、ユーザー入力引数に応じて挿入するファイルを指定できるスクリプトの一部として非インタラクティブなソリューションを探しているため、この特定のケースでは役に立ちません。
kenorb 2016

1

これが非XMLツールでXMLを解析する別の試みである場合は、行わないでください。

ここでの解決策は有効ですが、意図はそうではない可能性があります。XMLが適切に調整されたソースからのものではない場合、タグにエスケープ、CDATA、または空白が含まれる可能性があります。

そのため、viのコマンドのxsltprocはそれを処理できます。


このファイルは実際には適切なXML形式ではありませんが、実際には3つのXMLのようなタグを持つ十分に文書化されたiniファイルではありません。
ケノーブ2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.