16

シナリオ:

  • (文字のように)パイプで| 区切られたデータを含むテキストファイルがあります。
  • パイプ区切りフィールドのデータの各フィールドは可変長である可能性があるため、文字のカウントは機能しません(または、Vimに存在する場合でも、ある種のサブストリング関数を使用します)。

Vimを使用して、ファイル全体の2番目のパイプから行末までのすべてのデータを削除することは可能ですか?約150,000行あるので、これを手動で行うことはマゾヒストにとってのみ魅力的です...

たとえば、次の行を次のように変更します。

1111|random sized text 12345|more random data la la la|1111|abcde
2222|random sized text abcdefghijk|la la la la|2222|defgh
3333|random sized text|more random data|33333|ijklmnop

に:

1111|random sized text 12345
2222|random sized text abcdefghijk
3333|random sized text

これはどういうわけかできると確信しています...私は願っています。

更新:これをWindows XPで実行していることを述べておかなければならないので、言及されている* nixコマンドの一部にアクセスできません(cutWindowsでは認識されません)。

4

12 に答える 12

31
:%s/^\v([^|]+\|[^|]+)\|.*$/\1/
于 2009-01-15T20:38:33.157 に答える
18

マクロを記録することもできます。

qq02f|Djq

100@qそして、それを再生して、次の 100 行でマクロを実行することができます。

マクロの説明:

  • qq: マクロの記録を開始します。
  • 0: 行の最初の文字に移動します。
  • 2f|: 行で 2 番目に出現する| 文字を検索します。
  • D: 現在位置から行末までのテキストを削除します。
  • j: 次の行に移動します。
  • q: マクロの記録を終了します。
于 2009-01-15T20:43:58.560 に答える
8

Vim を使用する必要がない場合、別の代替手段として unixcutコマンドがあります。

cut -d '|' -f 1-2 file > out.file
于 2009-01-15T20:43:02.213 に答える
4

置換の代わりに、コマンドを使用して、 各行で:normal2 つのノーマル モード コマンドのシーケンスを繰り返すことができます。2f||D

:%norm!2f|D
于 2011-09-30T04:47:00.173 に答える
4

同じことを行う別の Vim の方法:

%s/^\(.\{-}|\)\{2}\zs.*//
%s/^\(.\{-}\zs|\)\{2}.*//  " If you want to remove the second pipe as well.

今回は、正規表現は、 が後に続くできるだけ少ない文字 ( \{-}) と 一致し|、2 回 ( \{2}) 無視されて、後続のすべてのテキスト ( \zs) が何もないものに置き換えられます ( //)。

于 2009-01-15T22:31:52.010 に答える
2

を使用:commandして、置換を実行するためのユーザーコマンドを作成できます。

:command -range=% YourNameHere <line1>,<line2>s/^\v([^|]+\|[^|]+)\|.*$/\1/
于 2010-01-28T18:51:14.323 に答える
1

次のこともできます。

:%s/^\([^\|]\+|[^\|]\+\)\|.*$/\1/g
于 2009-01-15T20:48:21.657 に答える
1

Awkを使用する:

awk -F"|" '{$0=$1"|"$2}1' file
于 2010-03-27T13:58:23.760 に答える
0

これにより、バッファ(1,$)内のすべての行がcutを介してフィルタリングされ、次の作業が実行されます。

:1,$!cut -d '|' -f 1-2

現在の行でのみ実行するには、次のことを試してください。

:.!cut -d '|' -f 1-2
于 2009-01-15T21:02:19.677 に答える
0

vim は非常に大きなファイルを処理するのが得意ではないことがわかりました。ファイルのサイズがわかりません。多分 cat と sed を一緒にするとうまくいくでしょう。

于 2009-01-15T20:40:47.677 に答える
0

sed ソリューションは次のとおりです。

sed -e 's/^\([^|]*|[^|]*\).*$/\1/'
于 2009-01-15T20:41:12.887 に答える
0

Vim を使用する理由 なぜただ走らないのか

cat my_pipe_file | cut -d'|' -f1-2
于 2009-01-15T20:42:57.453 に答える