переменная не расширяется при использовании sed в bash для цикла - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно запустить программу ( hole2 для тех, кто заинтересован) в директории, полной итеративно названных файлов. Я написал скрипт 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

Кажется, что $i не расширяется; Я знаю, что есть некоторые подобные сообщения SO на эту тему, но ни один из ответов, похоже, не помог в этом случае. Я пытался заключить команду sed в двойные или одинарные кавычки, пытался заключить в $i двойные, одинарные или обе кавычки, с и без фигурных скобок, но моя переменная $i записывается как $ i в моем конфигурационном файле, а не в расширенном пути к файлу, который должен быть.

Надеюсь, вышесказанное имеет смысл. Я не настроен на использование bash и открыт для альтернативных способов достижения этого.

Добавление обоих комментариев от kasul (который, увы, я уже пробовал) и kvantour (установите -x в shebang) приводит к следующему выводу

код:

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

На этот раз я оставил полные пути к файлам для ясности (/ laze)

выход

sed -i 's=coord '\''/media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/tst10705.pdb'\''=coord  /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=g' hole.inp
+ for i in /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/*.pdb
+ sed -i 's=coord  /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=coord '\''/media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/tst10706.pdb'\''=g' hole.inp
+ var=tst10706.pdb
+ hole
+ sed -i 's=coord '\''/media

Я убил его до того, как он пробежал все 20k кластеров *, но

Вывод из программы отверстия для tst10706 все еще читает; ошибка Не удается открыть входной файл с координатами pdb: $ Я

NB. Любой, кто ловко хотел бы указать на кластерный анализ 20-килограммовых структур, глуп, пожалуйста, не стесняйтесь, с тех пор я исправил эту ужасно ошибочную методологию, но я все же хотел бы найти проблему с кодом для будущего использования. .

Спасибо

...