次の形式のファイルがあります。
.
.
.
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 -n
Perlに、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:
。ジョブの行が複数ある場合は、複数の名前とジョブを印刷します。また、名前に職業欄がない場合は印刷されません。