vi/vim、すべての行のn番目の単語を新しいファイルに書き込む方法

vi/vim、すべての行のn番目の単語を新しいファイルに書き込む方法

新しいファイルにすべての行のn番目の単語を書き込むには?たとえば、new_file.txtのすべての行のうち2番目の単語を書きたいとします。

古いファイル.txt:

pippo pluto paperino 
gigi lui marco 
piero andrea chiara

新しいファイル.txt:

pluto  
lui   
andrea

答え1

最初のステップは、各行の2番目の単語を除くすべての単語を削除することです。これは非常に簡単な:%normコマンドです。

:%norm dwwhD

dwwhD各行を手動で入力するのと似ていますが、より高速です。 2番目のステップ、新しいファイルに保存:

:w new_file.txt

old_file.txtその後、何も変更されないように保存せずに終了します。

:q!

答え2

:!cut % '-d ' -f2 > new_file.txt

デフォルトの区切り文字はcutタブなので、区切り文字を空白に設定するには「-d」を使用する必要があります。

%Viの内部では、現在のファイル名を置き換えて使用できます。

答え3

単純なbashスクリプトを使用して、ターミナルコマンドラインでこれを実行できます。最初ファイル内容の繰り返し。その後、各ラインに対してエコーをawkにパイプします。awkに2番目の列を抽出させます。。最後に、テキストを新しいファイルにリダイレクトします。

これらすべてを総合すると、次のようになります。

while read line; do
    echo $line | awk '{print $2}' >> new_file.txt
done <old_file.txt

答え4

:s正規表現でコマンドを使用してください。

:%s/\v^\s*\S+(\s+(\S+).*)?/\2

これ\vVimに、grepまたはpcreの拡張正規表現に似た「非常に魔法のような」正規表現スタイルを使用するように指示します。

正規表現は先頭にある単一の単語と一致し、前にいくつかのオプションの空白があるかもしれません。その後、スペースの後に2番目の単語がグループ内にキャプチャされます\2。最後に、a.*は行の残りの部分全体と一致します。

最初の単語の後の部分はオプションです(角かっこでグループ化され、最後と一緒にオプションです?)。これにより、単一の単語を含む行がまだ一致し、その場合は空の行に置き換えられます。これは、2番目の単語がその行の場合に機能するため、単一の単語がある行に対して期待されるものです。これは、この操作に正規表現を使用する利点の1つです。エッジケースがある行を処理する方法をよりよく制御できるからです。

最後に\2グループに置き換えます。行の2番目の単語だけをキャプチャします。

その後、変更内容を新しいファイル名で保存できます。

:saveas new_file.txt

これにより、未変更の状態が維持され、old_file.txt現在のバッファに対する追加の修正はnew_file.txt.

関連情報