在bash中使用sed进行循环时,变量未扩展

时间:2019-03-19 13:26:54

标签: bash loops sed expand

我需要在充满迭代文件的目录上运行程序(对于感兴趣的人来说是 hole2 )。我已经编写了一个class PSerializer : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { PItem p = value as PItem; JObject jo = JObject.FromObject((PItem)value); var itemProperties = typeof(PItem).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly); var excludeList = new List<string> { "type" }; var itemProps = jo.Properties().Where(x => itemProperties.Any(y => y.Name == x.Name) && !excludeList.Any(y => y == x.Name)); writer.WriteStartObject(); foreach(var itemP in itemProps) { writer.WritePropertyName(itemP.Name); serializer.Serialize(writer, itemP.Value); } writer.WriteEndObject(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return objectType == typeof(PItem); } } class CSerializer : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.Formatting = Formatting.Indented; //May cause performance issues but easy to write. JObject jo = JObject.FromObject((CItem)value); jo.Remove("codes"); jo.WriteTo(writer); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return objectType == typeof(CItem); } } 脚本来遍历所需的文件,编辑所需的配置文件并运行程序。

我在循环内遇到bash命令时遇到了麻烦,因为它们似乎没有正确扩展变量。

下面的代码;

sed

#!/bin/bash cd /path/to/hole/dir shopt -s nullglob for i in /path/to/files/*.pdb; do echo $i sed -i "s=coord /path/to/files/=coord ${i}=g" config_file.inp var=${i:72} hole < configfile.inp > hole_out_$var.txt sed -i "s=coord ${i}=coord /path/to/files=g" config_file.inp done 似乎并没有扩大;我知道关于此主题有一些类似的SO帖子,但是在这种情况下似乎没有任何答案。我尝试将$i命令括在双引号或单引号中,尝试将sed括在双引号,单引号或两个引号中,并带有或不带有括号,但是我的$i变量是在我的配置文件中写为 $ i ,而不是它需要的扩展文件路径。

我希望以上所述是合理的。我不打算使用$i,并且愿意采用其他方法来实现这一目标。

加上来自kasul(我已经尝试过)和kvantour(将-x设置为shebang)的注释,结果如下:

代码:

bash

这次为了清楚(/懒散),我保留了完整的文件路径

输出

set -x

cd /home/jonah/hole2
shopt -s nullglob

for i in /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/*.pdb;
do
#      echo $i
    sed -i "s=coord  /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=coord '"${i}"'=g" hole.inp
    var=${i:72}
    hole < hole.inp > hole_c_$var.txt
    sed -i "s=coord '"${i}"'=coord  /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=g" hole.inp
done

在它遍历所有2万个簇之前,我将其杀死了,但是

从空洞程序输出的tst10706仍然读取; 错误 无法打开pdb坐标输入文件: $ i

注意:任何想巧妙地指出20k结构的聚类分析的人都是愚蠢的,请随意,自那以后,我已修复了这种严重缺陷的方法,但是我仍然想找到代码问题以备将来使用

谢谢

0 个答案:

没有答案