Vimの特定のテキストパターン間の行を結合する


8

次のようなテキストファイルがあります。

A.
text
text
text


A.
more text

more text

A.
more text

「マーカー」間のすべての行を結合しA.て、次のようにします。

A.texttexttext
A.more textmore text
A.more text

Vimでこれを行うにはどうすればよいですか?

回答:


4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

パターンマッチングを置き換えます。

  1. 改行、
  2. を含むグループ

    1. 文字列のA.直後に行末が続くのではなく
    2. 行末までの任意の文字

と:

  • 最初の改行(上記のグループ)を除いてすべて一致しました。

これをグローバルに行います。


1
ありがとう。それがどのように機能するのか私にはわかりませんが、それはそうです!私はそれを注意深く解剖しなければならないでしょう。また、すべての行を結合し、「A」に新しい行を挿入することで回避策を見つけました。
vim noob

@vimnoob::help \@!その部分の詳細については、Vimを参照してください。それ以外の場合は、うまくいけば、説明があれば簡単です。あなたのアプローチの問題はA.、孤立したマーカー行としてではなく、テキストに「」が発生した場合、それが元々マーカーであるかのように分割されることです。実際にはそれは問題ではないかもしれません(私はあなたの「実際の」ファイルがどのように見えるのかわかりません)が、一般にこれに気付いていない場合、望ましくない動作を引き起こす可能性があります。
Daniel Andersson、2012年

@vimnoob:もう一度答えを読みます。:%s///構文に慣れていない場合は、Vimの「検索と置換」構文です。:コマンドを開始し、%バッファー全体を範囲として指定しs、置換を開始します。/パターン区切り文字です(他の文字も使用できますが、/「標準」です)。1つ目/は検索パターンを開始し、2つ目は置換パターン、3つ目はそれを終了します。末尾の修飾子を使用して、大文字と小文字を区別しないように指定できます\1。検索パターンで取得されたグループを表します。ファイル内のと:%s/foo/bar/置き換えfooられbarます。
Daniel Andersson

ご協力ありがとうございます。これを調べればいいだけです\ @!基本的な検索置換と基本的な正規表現に精通しているためです。
vim noob

1
@Reman:私がすぐに考える最も簡単な方法は、のような後続のグローバルパターンマッチを実行すること:%s/^A\.//です。回答のメソッドは^A\.パターン自体をキャプチャしない(むしろそれらが存在しない)ため、これらの文字列を明白な方法で変更することはできません。
Daniel Andersson、

7

これも機能します(最初の行がで始まる場合A.

:v/^A/-1j!

それはうまくいきます!いいね。+1
ZaSter 2013年

はい、まさしく、グローバルアンチパターンマッチ(v)後の2つの新しいトリック:参加の「j」と「!」スペースを追加せずに参加します。ありがとうございました。
fortboise 2014年

@ミロすごい!私はあなたに敬礼します。なぜそれが機能するのかを説明できたら、スーパー!..また、間にタブ文字を付けて行を連結する必要があったので...発行する前に、すべての行の最後に/ $ / \ t / gタブ文字として追加しました上記のコマンド..より良い方法
ihightower 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.