如何将一段带有数字的文本添加到不同的文件中,每个文件中的数字递增

如何将一段带有数字的文本添加到不同的文件中,每个文件中的数字递增

我有很长一段文字,其中有一个数字。它大致看起来像这样:

aaaaaaaaaaaaaa100bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc100ddddddddddddddddd

我需要在一系列文件中显示此段落,但在每个文件中,数字比其前一个文件高 10。
例如,在文件 1.txt 中,它看起来像我上面显示的那样,但在 2.txt 中,它应该看起来像:

aaaaaaaaaaaaaa110bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc110ddddddddddddddddd

在3.txt中,它应该是这样的:

aaaaaaaaaaaaaa120bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc120ddddddddddddddddd

文本应该始终相同;只是每个新文件中的数字都会增加 10。另外,文件名(数字)应该增加。

我一直都是手工做的,但我需要将数量从 100 增加到 1000,所以这是一项艰巨的工作!我想知道在 Linux 上是否有一个命令可以完成这项工作?

答案1

下面是一个简单的 Python 3 脚本,它将每个数字加 10。

#!/usr/bin/env python3

import fileinput
import re

rx = re.compile(r'(\d+)')
for line in fileinput.input():
    parts = rx.split(line.rstrip('\n'))
    if len(parts) > 1:
        for i in range(1, len(parts), 2):
            parts[i] = str(int(parts[i]) + 10)
        line = "".join(parts)
    print(line)

这假设每行都以非数字开头。改变得稍微灵活一点并不难,但这似乎暂时解决了工作。

要从 Bash 脚本调用它,只需将其保存在文件中并以chmod a+x filename.py.因此,如果您将其保存在其中./splitnum.py,那么一旦您确保它具有执行权限,那就是运行它的命令。

这是 Perl 一行代码:

perl -lne '@s = split(/(\d+)/); for($i=1;$i<=$#s;$i+=2) { $s[$i] += 10 }; print(join("", @s))'

答案2

我认为 bash 的解决方案将是一场噩梦。这当然是可行的,特别是如果你愿意使用 awk,但这也不是真正的 bash,所以这里有一些 python

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument('--template', required=True, help="Template file")
parser.add_argument('--start', default=0, help="Number to begin counting from")
parser.add_argument('--stop', default=100, help="Number to end at")
parser.add_argument('--step', default=10, help="Number to increment by")
args = parser.parse_args()

for i in range(args.start, args.stop, args.step):
    with open('{}.txt'.format(i)) as pfile:
        pfile.write(args.template.format(count=i))

您可以通过传递“--start”作为开始的数字,“--stop”作为停止的数字,以及“--step”作为要递增的数字来运行它。您可以通过替换脚本顶部变量中的文本paragraph或将文本放入单独的文件中并使用“--template”传递文件名来替换您的段落。确保{count}在模板中需要该号码的任何地方使用。

答案3

如果该数字始终是一行的第一个数字并且您的文件只有一行,您可以使用简单的单行代码来完成此操作:

i=100; for k in $(seq 100 10 1000); do sed "s/$i/$k/g" file > file.$k; done 

file这假设使用以下内容调用原始输入文件:

$ cat file 
aaaaaaaaaaaaaa100bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccc100ddddddddddddddddd

并会产生file.100, file.110. 。 。file.1000


当然,这将需要几秒钟,因为它需要对每个文件运行单独的命令。为了更有效的方法,您可以使用 perl 命令:

perl -ne 'for ($i=110;$i<=1000;$i+=10){s/(\d+)/$i/eg; open($fh,">","file.$i");  print $fh "$_" }' file

相关内容