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

时间:2018-07-16 15:22:06

标签: linux bash unix scripting edit

我正在通过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文件中再添加两行(> ix_alpha = 0和alpha = .5)。

谢谢!

1 个答案:

答案 0 :(得分:-1)

您可以使用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/用“替换”替换“样式”
  • i text插入文本
  • 如果命令前面有/pattern/,则仅当当前行与模式匹配时才运行该命令,即,在这种情况下,将这些行插入Small_Diff行之前。
  • -i~告诉sed替换文件“就地”,保留备份并在名称后附加~(因此将有名为tmp0001.ctl~的备份,依此类推。)