Как исправить «однозначное перенаправление» и «неизвестный параметр для команды` s ': для sed - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь объединить pdbqt-гибкие файлы в один pdb, используя следующий скрипт:

http://prosciens.com/prosciens/oldproscienssarl/files/flexrigidpdbqt2pdb_template.sh

Проблемный фрагмент:

Давайте объединим файлы

  1. Сначала мы очищаем модель PDB

    grep ATOM ${FLEXPDBQT}_${MODEL}.pdb > ${FLEXPDBQT}_${MODEL}.pdb.tmp
    
  2. Далее мы создаем список остатков

    cut -c 18-27 ${FLEXPDBQT}_${MODEL}.pdb.tmp > residuelistraw.tmp`
    cat residuelistraw.tmp | uniq > residuelist.tmp
    
  3. Затем мы разделяем файл модели на остатки

    while read r
    do
    rns= echo $r | sed 's/ //g'
    egrep "[ \t]$r[ \t]" ${FLEXPDBQT}_${MODEL}.pdb.tmp > $rns.pdb.tmp
    sed -i 's/'$FLEXPDBQT'_'$MODEL'.pdb.tmp://' $rns.pdb.tmp
    

В настоящее время он завершается с ошибкой на шаге # 3, приводя к следующей ошибке:

/flexrigidpdbqt2pdb_template.sh: line 133: $ rns.pdb.tmp: ambiguous redirect
sed: -e expression # 1, character 9: unknown option for the `s' command

Я пыталсяисправьте ошибку, используя некоторую подстановку sed:

rns=`echo "${r/ /}"`
echo $rns
egrep "[ \t]$r[ \t]" ${FLEXPDBQT}_${MODEL}.pdb.tmp > $rns.pdb.tmp
sed -i 's/'$FLEXPDBQT'_'$MODEL'.pdb.tmp://' $rns.pdb.tmp

Но пока ничего не изменилось.

Моя версия sed 4.4

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

При ошибке «неоднозначного перенаправления»

Ошибка «неоднозначного перенаправления» вовсе не sed, а из вашей оболочки.

«Неоднозначное перенаправление»ошибка означает, что ваша оболочка вообще не может запустить команду, которую вы ей дали, потому что она не смогла выполнить перенаправления, запрошенные как часть среды этой команды.

В этом случае переменная rns равнапусто.

Это потому, что rns= echo $r | sed 's/ //g' не присваивает rns выходу sed на всех . Вместо этого он присваивает временную переменную среды с именем rns пустой строкой, только на время выполнения echo $r (выходные данные которого отправляются на sed, а оттуда настандартный сценарий).

Вместо этого используйте:

rns=${r//[[:space:]]/}

... или, менее эффективно:

rns=$(sed -e 's/ //g' <<<"$r")

Чтобы избежать той же ошибки в случаях, когдапеременная не пуста, не забудьте процитировать!

То есть вместо выполнения ... >$file всегда выполняйте ... >"$file", чтобы гарантировать, что нежелательное расщепление строк или расширение глобуса можетне сделать перенаправление, действующее в противном случае, неработоспособным. (Это не происходит со всеми версиями оболочки, но это означает, что неудачное цитирование приводит к непредсказуемости поведения вашего кода, если вы не знаете, с какой версией оболочки он будет работать!).


Вклошибка «неизвестная опция»

Если вы используете / в качестве разделяющих сигил частей вашей команды sed, то у вас не должно быть никаких / s в заменяемых данных . Если вы не можете гарантировать это, используйте другой символ вместо /;например, s@/foo/bar@/baz/qux@ работает правильно.

0 голосов
/ 08 октября 2019

Похоже, что важной частью для исправления этого скрипта было изменение rns, как вы предложили:

rns=${r//[[:space:]]/}

и последующее цитирование вывода:

sed -i 's/'$FLEXPDBQT'_'$MODEL'.pdb.tmp://' "$rns.pdb.tmp"

Однако при следующем шаге возникают другие проблемы, ранее не показанные:

sed '/'"HN ${r}"'/ r '${rns}'.pdb.tmp' ${RIGIDPDBQT}_${LIGNAME}_${MODEL}_apo.pdb > "${RIGIDPDBQT}_${LIGNAME}_${MODEL}_apo.pdb.tmp"

Это не приводит к выводу (и без ошибок), вероятно из-зак другой проблеме с sed (которую я действительно не могу понять).

Трудно привести здесь рабочий пример - множество предварительно отформатированных текстовых файлов. Несмотря на это, проблема, о которой я спрашивал, решена, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...