如何修复“明确的重定向”和“ s”命令的未知选项:用于sed

时间:2019-10-07 11:53:33

标签: bash sed ubuntu-18.04 protein-database

我正在尝试使用以下脚本将pdbqt-flexible文件合并为一个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 个答案:

答案 0 :(得分:2)

关于“歧义重定向”错误

“歧义重定向”错误根本不是来自sed,而是来自您的shell。

“歧义重定向”错误意味着您的shell根本无法启动您提供的命令,因为它无法执行该命令环境中所请求的重定向。

在这种情况下,变量rns为空。

这是因为rns= echo $r | sed 's/ //g' 根本没有将rns分配为sed的输出。取而代之的是,它仅在执行rns的过程中将名为echo $r的瞬态环境变量分配为空字符串(其输出发送到{{1 }},并从那里到脚本的stdout。

相反,使用:

sed

...或者效率较低:

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

为避免在变量不为空的情况下发生相同的错误,请务必引用!

也就是说,始终运行rns=$(sed -e 's/ //g' <<<"$r") 而不是运行... >$file,以确保不需要的字符串拆分或glob扩展不会使原本有效的重定向不可行。 (并非所有的Shell版本都发生这种情况,但这意味着如果不加引号,则会导致代码的行为无法预测,除非您知道它将与哪个Shell版本一起运行!)。


关于“未知选项”错误

如果您使用... >"$file"作为/命令的分隔符,则您要替换的数据中不得包含任何sed 。如果您不能保证这一点,请使用其他符号代替/;例如/正常工作。

答案 1 :(得分:0)

看来,修复该脚本的必要部分是按照您的建议更改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的另一个问题(我真的不明白)。

这里很难给出一个有效的例子-许多预格式化的txt文件。尽管如此,我提出的问题已解决,谢谢!