Vimを使ってテキストファイルを切り取る方法

Vimを使ってテキストファイルを切り取る方法

vimを使ってテキストファイルを切り取る方法は?たとえば、ファイルを場所56に切り取りたいとします。したがって、位置1〜56のすべての内容を維持し、位置57(含む)から各行の終わりまでのすべての内容を削除したいと思います。

テキストファイル:

Web Application - http://sharepoint

Url                                                     CompatibilityLevel
---                                                     ------------------
http://sharepoint                                       15
http://sharepoint/sites/appcatalog                      15
http://sharepoint/sites/devtest                         15
http://sharepoint/sites/publishing                      15

awkを使用すると、私が欲しいものをある程度得ることができます。

$awk '{print $1}' file

結果:

Web

Url
---
http://sharepoint
http://sharepoint/sites/appcatalog
http://sharepoint/sites/devtest
http://sharepoint/sites/publishing

ところが、問いたいとしたら、ぜひタイトルを維持したい。 vimを使用してこのファイルを技術的に56の場所に切り取るにはどうすればよいですか?好ましくはvimで。 vimでファイルを開いたという意味です。

答え1

これを行うにはいくつかの方法があり、そのいくつかは次のとおりです。

  1. :%s/\%>56c.//g
  2. :%s/\%57c.*//
  3. :%s/\v^.{56}\zs.*//
  4. :% normal 57|D(この仮説virtualedit=allまたはvirtualedit=onemore
  5. Shift-g57|Ctrl-v1Shift-gEndx(この仮定virtualedit=all

編集する:リクエストに応じてマニュアルに関連する逆流を追加しました。

  • 1.と2.(:h /\%c)の場合:

    \%23c 特定の列を一致させます。
    \%<23c 特定の列を一致させる前に。
    \%>23c 特定の列を一致させた後。
    これら3つを使用して、バッファまたは文字列の特定の列を一致させることができます。 「23」は任意の列番号であってもよい。最初の列は1です。実際、列はバイト数です(したがって、マルチバイト文字の場合は正確ではありません)。

  • 3.( :h \zs)の場合:

    \zs どこでも一致し、一致開始を設定します。次の文字は完全一致の最初の文字です。

  • 4.( :h |:h D:h :normal:h :%:h 'virtualedit')の場合:

    | 現在行の列[数]をフィルタリングします。排他的な動き。シシはパイプではありません

    ["x]D 行末までカーソルの下の文字を削除し、[count]-1行を[レジスタxで]削除します。 「d$」の同義語です。

    :norm[al][!] {commands}通常モードコマンド{commands}を実行します。これにより、コマンドラインに入力された通常モードコマンドを実行できます。 {commands}は入力したように実行されます。

    % 等しい1,$(フルファイル)

    'virtualedit' カンマ区切りの単語リスト:
    block ビジュアルブロックモードで仮想編集が可能です。
    insert 挿入モードで仮想編集を許可します。
    all すべてのモードで仮想編集が可能です。
    onemore カーソルが行末を通過することを許可する

    仮想編集とは、実際の文字がないところにカーソルを置くことができるという意味です。これは、タブの中央または行末を超えている可能性があります。ビジュアルモードで長方形を選択してテーブルを編集するのに便利です。

  • 5.( :h G, :h CTRL-V, :h <End>, :h x)の場合:

    G デフォルトが最後の行である[count]行に移動し、空白ではなく最初の文字を1行ずつ検索します。

    [count]CTRL-V ブロックごとにビジュアルモードを開始します。

    $または<End>行末まで。

    ["x]xカーソルの下と後の[count]文字を[xを登録するために]削除します(1行ずつ削除しません)。 「dl」と同じです。

答え2

「位置」が「列」を参照すると仮定すると、正規表現を使用できます。

:%s/^\v(.{56}).*/\1/

^これは、Perl(\v魔法)が行の先頭から始めて.56回一致し、その内容(括弧)を保存して.*行の残りの部分と一致するように置き換えるという意味です\1

awk何らかの理由でフィルタが違法でない限り、moreまたはlessを呼び出すことがあります。

:%!awk '{print $1}'

答え3

vimから{print $1}ヘッダーを除くすべてを取得するには、次のようにします。

:2,$s/ .*// 

関連情報