ファイルからフィールドを抽出し、vimの他のファイルに保存します。

ファイルからフィールドを抽出し、vimの他のファイルに保存します。

次の形式のファイルがあります。

.

.

.

Name:abc

Occupation:def

.

.

Name:xyz

Occupation:ghi

.

. 

vim名前とジョブフィールドを抽出し、次の形式を使用して別のファイルout.txtに保存したいと思います。

Name:abc

Occupation:def

Name:def

Occupation:ghi

編集:入力ファイルのジョブフィールドの場所が更新されました。

答え1

ggyG:e out.txt<cr>p:v/Name\|Occupation/d<cr>:w<cr>

説明する

gg # Go to beginning of file
y  # yank (copy)
G  # to end of file
:e out.txt # Open a new file called out.txt
p  # paste what you just copied
:v/Name\|Occupation/d # Delete all lines that don't contain Name or Occupation
:w # save

答え2

vimバッファと終了()を作成して使用するのは:wqどうですか?

grep -E '^(Name|Occupation)' your_file >out.txt

このコマンドは、指定したパターンに一致するすべての行をgrep印刷します。your_fileここで使用されているパターンには拡張正規表現が必要です。これを-Eに切り替えるために使用しますgrep。パターンは次のとおりです。

  • ^行の始まりを示します。
  • (Name|Occupation)検索を意味NameするOccupation
  • 要約すると、正規表現は単語で始まる行Nameまたは単語で始まる行を見つけることを意味しますOccupation

そのままにすると、このgrepコマンドは一致するすべての行を端末に印刷します。最後の桁(>out.txtリダイレクトコマンドの出力は端末の代わりにファイルgrepに移動されます。out.txt

答え3

ウィム:

:g/\./d | sav /tmp/otherFileName

社会経済開発局:

sed '/\(\.\)/d' InputFile >> /tmp/otherFileName

完璧:

:v/^Name*\|^Occupation*/d | s/^Name/\r&/g | sav /tmp/OtherFileName

答え4

外からvim、その中からできる結果を得るために同じ結果を得ることができるコマンドラインツールがたくさんあります。 Perlを例に挙げましょう。

 perl -n -e '$name=$1 if(/^(Name: .+)$/); print "$name\n\n$_\n" if(/^Occupation: .+/);' < file > out.txt

perl -nPerlに、STDIN標準入力()の各行をwhileループにラップするように指示します。 perlコマンドの最後に使用するSTDINと、ファイルを次にリダイレクトできます。< file

これは、リダイレクトする各行でperlコマンドを実行できるようにする効果がありますfile

-e次に、Perlはこのオプションを使用して実行する必要があるコマンドを次のように指定します。

'$name=$1 if(/^(Name: .+)$/); print "$name\n\n$_\n" if(/^Occupation: .+/);'

'(perlコマンドラインでは、-eオプションが単一の引数として必要なので、perlディレクティブの周りに一重引用符があることに注意してください。)

コードのロジックを見ると、

 $name=$1 if(/^(Name: .+)$/);

^が始まり、Name:その後に1つ以上の文字が続き、行の.+終わりが来ると、$それをラップするとすべての一致を保存でき、()という特殊変数で使用できます$1。だからすべてがName: whateverに保存されます $1。次にそれをという変数に割り当てます$name

前のガイドラインと同様に、次に行う作業は次のとおりです。

 print "$name\n\n$_\n" if(/^Occupation: .+/);'

^が始まり、その後Occupation:に1つ以上の文字が.+続き、行が終わると、$以前に一致する名前行($ nameに格納)、2つの改行文字\n\n、および$_whileによって処理されている現在の行の内容が印刷されます。ループ(私たちの場合はOccupation行と一致する)の後に別の改行文字が続きます\n

最後に、このコマンドの出力をout.txtにリダイレクトします> out.txt

Name:次の各行(次の数行)には、その仕事に関連する仕事があるとしますName:。ジョブの行が複数ある場合は、複数の名前とジョブを印刷します。また、名前に職業欄がない場合は印刷されません。

関連情報