新しいファイルにすべての行の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
これ\v
Vimに、grepまたはpcreの拡張正規表現に似た「非常に魔法のような」正規表現スタイルを使用するように指示します。
正規表現は先頭にある単一の単語と一致し、前にいくつかのオプションの空白があるかもしれません。その後、スペースの後に2番目の単語がグループ内にキャプチャされます\2
。最後に、a.*
は行の残りの部分全体と一致します。
最初の単語の後の部分はオプションです(角かっこでグループ化され、最後と一緒にオプションです?
)。これにより、単一の単語を含む行がまだ一致し、その場合は空の行に置き換えられます。これは、2番目の単語がその行の場合に機能するため、単一の単語がある行に対して期待されるものです。これは、この操作に正規表現を使用する利点の1つです。エッジケースがある行を処理する方法をよりよく制御できるからです。
最後に\2
グループに置き換えます。行の2番目の単語だけをキャプチャします。
その後、変更内容を新しいファイル名で保存できます。
:saveas new_file.txt
これにより、未変更の状態が維持され、old_file.txt
現在のバッファに対する追加の修正はnew_file.txt
.