![创建文件的多个副本,每个副本中的一行发生更改](https://linux22.com/image/136038/%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%89%AF%E6%9C%AC%EF%BC%8C%E6%AF%8F%E4%B8%AA%E5%89%AF%E6%9C%AC%E4%B8%AD%E7%9A%84%E4%B8%80%E8%A1%8C%E5%8F%91%E7%94%9F%E6%9B%B4%E6%94%B9.png)
我必须自动化模拟,为此我需要为每个模拟创建输入文件。我的大部分模拟几乎是相同的,只是一行文本从一个文件更改为下一个文件。如何获取一个文本文件,并在更改特定行的情况下制作多个副本?例如,如果文本文件包含:
! input file
a = 6
b = 6
d = 789
! end
假设我想从此模板创建 6 个新文件,但我的变量 b 在每个后续文件中都减一,我该如何在 bash 或 python 中执行此操作?
答案1
基本方法可以与此类似,在示例中我修改 a= 值 bye 数字 & 文件 & 文件名也有内部值,因此它是分隔的文件
#!/bin/bash
for i in a b c 1 2 3 ; do
cat > file${i} << EOT
! input file
a = ${i}
b = 6
d = 789
! end
EOT
done
所以你会得到 6 个文件,其中有 6 个不同的内容:
# cat file?
! input file
a = 1
b = 6
d = 789
! end
! input file
a = 2
b = 6
d = 789
! end
! input file
a = 3
b = 6
d = 789
! end
! input file
a = a
b = 6
d = 789
! end
! input file
a = b
b = 6
d = 789
! end
! input file
a = c
b = 6
d = 789
! end
例如,如果您必须从参考文件中读取 b 值,您可以使用 read 子命令中的变量
while read ; do
cat > file${REPLY} << EOT
! input file
a = 1
b = ${REPLY}
d = 789
! end
EOT
done < referencefile
真实情况的完整示例:
[root@h2g2w tmp]# cat > ./test.sh
while read ; do
cat > file${REPLY} << EOT
! input file
a = 1
b = ${REPLY}
d = 789
! end
EOT
done < referencefile
[root@h2g2w tmp]# cat > referencefile
qsd
gfd
eza
vxcv
bxc
[root@h2g2w tmp]#
[root@h2g2w tmp]# sh ./test.sh
[root@h2g2w tmp]# ls -lrth file???
-rw-r--r--. 1 root root 41 28 juin 22:47 fileqsd
-rw-r--r--. 1 root root 41 28 juin 22:47 filegfd
-rw-r--r--. 1 root root 41 28 juin 22:47 fileeza
-rw-r--r--. 1 root root 41 28 juin 22:47 filebxc
[root@h2g2w tmp]# cat file???
! input file
a = 1
b = bxc
d = 789
! end
! input file
a = 1
b = eza
d = 789
! end
! input file
a = 1
b = gfd
d = 789
! end
! input file
a = 1
b = qsd
d = 789
! end
[root@h2g2w tmp]#
我希望您现在可以根据您的需要进行调整。
答案2
仅使用 bash:文件名为“file”
# slurp the whole file into a variable
contents=$(< file)
# find the value of b, using regular expression
# - with bash regex, the literal parts are quoted and the metachars are not
if [[ $contents =~ "b = "([0-9]+) ]]; then
b_val=${BASH_REMATCH[1]}
# create a printf-style format string
template=${contents/b = $b_val/b = %d}
# then, count down from the b value to 1, creating the new files
for (( n = b_val; n >= 1; n-- )); do
printf "$template\n" $n > "file.$n"
done
fi
然后:
$ ls -lt
total 6220
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:46 file.1
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:46 file.2
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:46 file.3
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:46 file.4
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:46 file.5
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:46 file.6
-rw-rw-r-- 1 jackman jackman 39 Jun 28 17:35 file
...
$ grep ^b file{,.?}
file:b = 6
file.1:b = 1
file.2:b = 2
file.3:b = 3
file.4:b = 4
file.5:b = 5
file.6:b = 6