vim:宏用一些数学插入行号

时间:2013-03-17 08:52:20

标签: vim macros

我有一个包含超过10万个小文件的目录。 我想将它们放在不同的文件夹中。

find mydir/ -type f | sort > tt.txt
vim tt.txt

现在我想为每一行插入一个带有这个公式的数字:

(行号)+ 50000 +((行号/ 1000)* 1000)

所以原始文件是这样的:

abainville_55130_55001.htm
abancourt_59268_59001.htm
abbenans_25340_25003.htm
abergement-de-cuisery_71290_71001.htm

应输出:

51001 - abainville_55130_55001.htm
51002 - abancourt_59268_59001.htm
51003 - abbenans_25340_25003.htm
51004 - abergement-de-cuisery_71290_71001.htm

依此类推,直到第1000行

line  998 => 51000 - bannes_53340_53019.htm
line  999 => 51000 - bannieres_81500_81022.htm
line 1000 => 52000 - bannoncourt_55300_55027.htm
line 1001 => 52000 - banos_40500_40024.htm
line 1002 => 52000 - bans_39380_39037.htm

然后我将应用一个宏将其转换为:

mv bannes_53340_53019.htm 51998/bannes_53340_53019.htm
mv bannieres_81500_81022.htm 51999/bannieres_81500_81022.htm
mv bannoncourt_55300_55027.htm 52000/bannoncourt_55300_55027.htm
mv banos_40500_40024.htm 52001/banos_40500_40024.htm
mv bans_39380_39037.htm 52002/bans_39380_39037.htm

(最后一部分很简单,不是问题,问题与数学有关)。

我知道有类似但我无法找到应用我的数学的解决方案:

:s/^/\=(line('.')+51000)/

2 个答案:

答案 0 :(得分:1)

你快到了。您可以使用以下命令:

:%s/^/\=line('.')+51000 . " - "/

其中%将其应用于整个文件,.执行字符串连接以获取间隔连字符。

修改

为了将/用作表达式的一部分,您可以更改分隔符(请参阅:help E146)。例如,以下为1000行生成51000,然后为接下来的1000行生成52000,依此类推:

:s!^!\=50000 + (line('.') / 1000) * 1000 . " - "!

答案 1 :(得分:1)

您不必分两步完成这项工作,如果您想坚持使用vim,可以在一个简短的时间内使用vim生成"mv..."命令行。

试试这一行:

%s#.*$#\="mv ".submatch(0)." ".(line(".")+50000+((line(".")/1000)*1000)) . "/" . submatch(0)#

将生成如下内容:(if the first line is on line number 1

mv abainville_55130_55001.htm 50001/abainville_55130_55001.htm
mv abancourt_59268_59001.htm 50002/abancourt_59268_59001.htm
mv abbenans_25340_25003.htm 50003/abbenans_25340_25003.htm
mv abergement-de-cuisery_71290_71001.htm 50004/abergement-de-cuisery_71290_71001.htm