3

I have a text file with a list in it:

dateformatfile.ext
dateformatfile.ext
dateformatfile.ext
...

I need to add a padded number to the end of each, like so:

dateformatfile.ext 00001
dateformatfile.ext 00002
dateformatfile.ext 00003
...

There are a lot, so I need to have a command to do this somehow.

Thanks in advance.

4

6 に答える 6

9

ファイルのすべての行に対してこれを行いたいと仮定すると、次のように行番号を使用できます。

:execute "% normal A \<C-R>=printf(\"%05d\", line(\".\"))\<CR>"

どこ

  • execute(...)文字列をコマンドとして実行します
  • % normalファイルのすべての行で通常のコマンドを実行します
  • A行に追加します
  • <C-R>=コマンドの結果を挿入します
  • printf("%05d", ...)2 番目のパラメータを 5 桁の数字としてフォーマットします
  • line(".")現在の行の番号を取得します
  • <CR><C-R>=挿入を完了します
于 2012-12-27T18:25:49.273 に答える
2

これが私の見解です。

最初の番号を追加する最初の行にカーソルを置きます。
:let i=0カウントを保持する変数を定義します。
qmマクロのレジスタmへの記録を開始します。
A <C-R>=printf("%05d", i)<CR><ESC>スペースとprintfからの出力を追加します。
:let i+=1次のマクロ実行のカウントを増やします。
qマクロの記録を終了します。

jVG番号を追加するドキュメントの残りの部分を視覚的に選択します。
:normal @mマクロを実行して、選択した行に番号を追加します。

このアプローチにはいくつかの利点があると思います。

  • 醜い脱出は必要ありません。
  • カウントは行番号に関連付けられていません。オフセットを考慮します。
  • マクロの使用は、 :globalコマンドと簡単に組み合わせることができます。例えば:

:g/ext$/ normal @mextで終わる行のレジスタmに格納されているマクロを実行します。

于 2012-12-28T08:55:01.957 に答える
2

if your text block is sitting at the beginning of the file. which means the line you want to append "00001" is the first line of your file, try this command, I just simply check the line ending with ext, you could change it to right regex if it is needed:

:%s/ext$/\="ext  ".printf("%05d", line("."))/g

if the text block is not at the beginning of the file. You just check the first line (the line you want to append 00001) of the block and get the line number, for example, line number 5:

:let b=5|%s/ext$/\="ext  ".printf("%05d", line(".")-b+1)/g
于 2012-12-27T20:41:45.063 に答える
0

私はマクロを使用してこれを行います(私はマクロが好きです:D)。

まず、数字の世話をしましょう(後でそれらを埋めます)。最初の行の最後に番号1を手動で追加します。次に、このマクロを最初の行に記録します。

qq        - record the macro q
$         - go at the end of the line
F<space>  - go backward to the last space
"ay$      - copy till the end of the line in the buffer a
j$        - go at the end of the line below
"ap       - copy the buffer content
<ctrl+A>  - increment the number
q         - stop recording the macro

これで、 1000 @ qで何度も適用できます(ファイルの最後で停止します)。

これは本当にきれいではありませんが、それは仕事をします。

パディングには、別の醜いトリックを使用します。まず、正規表現を使用して3桁の数字を照合し、前に0を追加してから、2桁の数字(今回は2つの0を追加)で同じことを行います。

vimマクロはかなり醜いですが、疲れすぎてワンライナーを書くことができない場合に役立ちます(ただし、awkを学ぶ必要があります)。また、あいまいでありながら便利なvimショートカットを覚えておくのにも役立ちます。

于 2012-12-27T18:37:24.490 に答える
0

環境にPERLがある場合は、VIMセッション内でPERLワンライナーを実行できます。

:%! perl -pe " $count++ ; s/$/$count/"

注意点は、perlスクリプトを二重引用符で囲む必要があるかもしれないということです。私のPCでは、一重引用符を使用するとPERLが実行されます。しかし、ドル記号で変数に対処することはできません。

于 2013-02-05T23:34:32.663 に答える
0

これは、awk を使用して非常に簡単に行うことができます。NR 変数はレコード番号を示し、RS 変数が再定義されない限り、レコードは行にマップされます。したがって、次のようになります。

awk -e '{ print $0 NR }' filenameトリックを行う必要があります。それらをパディングすることは、読者に任された演習です。

于 2012-12-27T18:27:05.000 に答える