2

段落内のすべての行を結合しようとしていますが、ある段落を次の段落と結合していません。

私のテキスト ファイルでは、段落はその間の空白行ではなく、行末にピリオドで定義されています。ピリオドの後に空白がある場合がありますが、それでも段落の終わりを定義します。

そこで、最後にピリオドがある行で停止するのではなく、次の行の終わりにジャンプするマクロを実行したいと考えました。

私はこの正規表現を使用しました:

[^\.\s][\s]*$

意味: ピリオドでも空白でもなく、必要に応じて行末まで空白が続く文字を検索します。

次に、コマンドを適用してJ 、一致した行を次の行と結合し、繰り返します。

RegexPalでは問題なく動作しますが、Vim では、ピリオドと 2 つのスペースを含む行で停止します。

私は何を間違っていますか?

4

3 に答える 3

3

コマンドと組み合わせてマクロで正規表現を使用する代わりにJ、正規表現の置換を使用して改行を削除するのはどうですか? これは私にとってはうまくいくようです:

:%s/[^\.]\s*\zs$\n\(^\s*$\n\)*/ /

説明:

  • [^\.]\s*\zs$\n-- ピリオドで終わらない行。改行の前に置換を開始します。
  • \(^\s*$\n\)*-- 空白のみを含むその他の行を含める

この正規表現はスペースに置き換えられます。

于 2012-06-25T15:00:18.887 に答える
2

カーソルが段落の最初の行にある場合、その行を次のように結合できます

:,/\.\s*$/j

バッファ内のすべての段落に対して同じことを行うには、次のコマンドを使用します

:g/^/,/\.\s*$/j
于 2012-06-25T18:06:26.030 に答える
1

これで途中まで到達するはずです。shimeのregexp(\.\s*$)を使用して結合する行を識別し、を使用:v//j!してそのような各行を次の行に結合します。

:v//j!次に、完了するまでコマンドを繰り返します。(それを行うためのマクロを定義します: それから繰り返し:map v :v//j!<cr>ヒットします。)v

* NIXのようなマシンを使用している場合のより良い解決策は、次のとおりです。

awk '/\.\s*$/ { printf("%s\n", $0);} { printf("%s", $0); } END { printf("\n"); }' <your_file >your_other_file
于 2012-06-28T20:22:39.447 に答える