使用 bash 从文件名创建格式化文本文件

使用 bash 从文件名创建格式化文本文件

编辑:我是堆栈交换和 bash 脚本的新手,所以请原谅;我猜我的问题被否决的原因是因为它太模糊或者因为我自己没有先尝试任何事情,所以我花了一天时间做后者,并想出了一种在我需要的格式,但我仍然不知道如何围绕它创建必要的结构,例如“MRS_struct = GannetLoad({})”

ls -1 *GABA.dat | tr '\n' ' ' | sed -e "s/[^ ][^ ]*/'&'/g" >> filenames.m

ls -1 *water.dat | tr '\n' ' ' | sed -e "s/[^ ][^ ]*/'&'/g" >> filenames.m

ls -1 *.nii | tr '\n' ' ' | sed -e "s/[^ ][^ ]*/'&'/g" >> filenames.m

/编辑

我有一个充满 3 系列文件的目录:

  1. 文件名为(例如,,)IDv#_GABA.dat3001v1_GABA.dat3002v1_GABA.dat
  2. 文件名为(例如,,)IDv#_water.dat3001v1_water.dat3002v1_water.dat
  3. 文件名为(例如,,)。ID_v#.nii3001_v1.nii3002_v1.nii

给定的目录仅包含具有一个特定的文件v#(即,仅v1文件或仅v2文件)。

我想通过 bash 脚本以以下格式(使用上面的示例文件)从这些文件名编写一个文本文件:

MRS_struct = GannetLoad({'3001v1_GABA.dat' '3002v1_GABA.dat'},{'3001v1_water.dat' '3002v1_water.dat'});  
MRS_struct = GannetFit(MRS_struct);  
MRS_struct = GannetCoRegister(MRS_struct, {'3001_v1.nii' '3002_v1.nii});  
MRS_struct = GannetSegment(MRS_struct);  

答案1

正如通配符在评论中指出的那样,这主要是为了将正确的文本包装在一些作用于全局扩展的“打印”循环中。唯一的区别(除了 Q 示例输出中可能存在的单引号拼写错误之外)是下面的脚本将在列表中最后一个元素后面放置一个尾随空格。请参阅下面的示例输出。

#!/bin/sh

printf "MRS_struct = GannetLoad({";
for f in *_GABA.dat
do
  printf "'%s' " "$f"
done
printf "},{"

for f in *_water.dat
do
  printf "'%s' " "$f"
done
printf "});\n"

printf "MRS_struct = GannetFit(MRS_struct);\n"

printf "MRS_struct = GannetCoRegister(MRS_struct, {"
for f in *.nii
do
  printf "'%s' " "$f"
done
printf "});\n"

printf "MRS_struct = GannetSegment(MRS_struct);\n"

问题的输出示例:

MRS_struct = GannetLoad({'3001v1_GABA.dat' '3002v1_GABA.dat'},{'3001v1_water.dat' '3002v1_water.dat'});  
MRS_struct = GannetFit(MRS_struct);  
MRS_struct = GannetCoRegister(MRS_struct, {'3001_v1.nii' '3002_v1.nii});  
MRS_struct = GannetSegment(MRS_struct); 

上述脚本的输出:

MRS_struct = GannetLoad({'3001v1_GABA.dat' '3002v1_GABA.dat' },{'3001v1_water.dat' '3002v1_water.dat' });
MRS_struct = GannetFit(MRS_struct);
MRS_struct = GannetCoRegister(MRS_struct, {'3001_v1.nii' '3002_v1.nii' });
MRS_struct = GannetSegment(MRS_struct);

相关内容