编辑目录中的多个文本文件

Edit multiple text files in directory

我正在通过 Ubuntu 终端使用 bash。我想对目录中具有相同扩展名的所有文件进行相同的文本编辑。我的目录包含多个版本的 227 个数字计数数据文件。例如我有:

tmp0001.ctl
tmp0001.out
tmp0001.trees
tmp0001.txt
tmp0002.ctl
tmp0002.out
tmp0002.trees
tmp002.txt

以此类推

我有兴趣编辑的文件是扩展名为“.ctl”的文件。目前,.ctl 文件看起来像这样(当然数字从 tmp0001 到 227 不等):

seqfile = tmp0001.txt
treefile = tmp0001.trees
outfile = tmp0001.out
noisy = 3
seqtype = 2
model = 0
aaRatefile = 
Small_Diff = 0.1e-6
getSE = 2
method = 1

我想编辑 .ctl 文件,使它们显示为:

seqfile = tmp0001.txt
treefile = tmp0001.trees
outfile = tmp0001.out
noisy = 3
seqtype = 2
model = 2
aaRatefile = lg.dat
fix_alpha = 0
alpha = .5
ncatG = 4
Small_Diff = 0.1e-6
getSE = 2
method = 1

虽然我不确定如何执行此操作,但我想使用像 nano 或 sed 这样的编辑器,但我不确定如何自动执行此操作。我的想法大致如下:

for file in *.ctl
do
nano
???

希望这不会太复杂!本质上,我想更改那里已有的两行(模型和 aaratefile),并在每个 .ctl 文件中再添加 2 行(>ix_alpha = 0 和 alpha = .5)。

谢谢!

您可以使用sed来执行任务:

sed -e 's/model = 0/model = 2/; s/aaRatefile = /aaRatefile = lg.dat/' \
    -e '/Small_Diff/ i fix_alpha = 0\nalpha = .5\nncatG = 4' \
    -i~ *.ctl
  • s/pattern/replacement/ 将 "pattern" 替换为 "replacement"
  • i text 插入文本
  • 如果命令前面有 /pattern/,则只有当前行与模式匹配时,命令才为 运行,即在这种情况下,这些行插入在 Small_Diff 之前行。
  • -i~ 告诉 sed 替换文件 "in place",留下名称附加 ~ 的备份(因此会有名为 tmp0001.ctl~等)