
奇妙な改行文字を含むファイルを修正するのに忙しかったです。ここに小さな例があります。
Row ('Row 01') Property ('Property 01')
Row ('Row 02') Property ('Property
02')
Row ('Row 03') Property ('Property 03')
したがって、2番目の行には属性値に改行文字が含まれているため、最初と最後の行のように1行でなければなりません。
VIMで次のように変更できました。
Remove all Line Breaks everywhere
:%s/\n/ /g
これは私に与える
Row ('Row 01') Property ('Property 01') Row ('Row 02') Property ('Property 02') Row ('Row 03') Property ('Property 03')
それから
Reinsert new Line Breaks only where they are wanted
:%s/ Row/\rRow/g
これは私が望むデータを提供します
Row ('Row 01') Property ('Property 01')
Row ('Row 02') Property ('Property 02')
Row ('Row 03') Property ('Property 03')
問題は、数千行のファイルから改行文字をすべて削除することは非常に遅いため、不可能であることです。
最初にすべてを1行に折りたたむことなくこれを処理できる、より良いVIM検索と交換方法がないかどうか疑問に思います。
答え1
gg!Gperl -0 -p -e 's/\n/ /mg; s/ Row/\nRow/mg; s/ \Z/\n/'<enter>
- gg - ファイルの先頭に移動
- !G は、現在の場所からファイルの最後まで次のようにパイプします。
perl -0 -p -e '....'
vim
バッファ全体をPerlスクリプトの出力に置き換えます。中間ステップ(新しい行はありません)を見ることはできず、とんでもない長い行を処理する必要もありません。
最後のドアにはs/ \Z/\n
スペースが置き換えられました。ファイルの終わりに(最初のステートメントによってaから変換されます\n
)、適切なテキストファイルになるように(つまり、最後の行は改行文字で終わります)、いいえ改行文字の直前にある可能性がある他のスペースを変更してください。または、ファイルの最後に移動して手動で改行を追加することもできます。
より良い方法は でvi
保存して終了し、シェルで実行することです。
perl -i.bak -0 -p -e 's/\n/ /mg; s/ Row/\nRow/mg; s/ \Z/\n/' filename.txt
これにより、ファイルが「所定の位置」に変更され、ファイル名が「拡張子」の元のファイルのバックアップコピーが保持されます。.bak