我有很长一段文字,其中有一个数字。它大致看起来像这样:
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