1

假设我有一个嵌套的 for 循环:

for i in $test
do
    name=something

    for j in $test2
    do
        name2=something
        jj=$j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g
        if [ name == name2 ]
        then
        qsub scrip.sh $i $j $jj
        fi
    done
done

现在,当我尝试将变量 $j 重命名为变量 $jj 时,就会出现问题。if我只返回空值以在语句中提交脚本。是否有另一种重命名变量的方法,以便我可以将它们传递给if代码的一部分?PS。我尝试了 3 个 for 循环,但这使得脚本非常慢。

4

3 回答 3

2

您的问题是将作业通过管道传输到 sed。尝试类似的东西

jj=$(echo $j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g)

这使用命令替换来分配jj.

于 2013-04-26T08:10:09.410 回答
2

这是不正确的:

jj=$j | sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g

为了将命令的输出分配给变量,您需要像这样使用命令替换

jj=$(sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g <<< "$j")

您甚至可能不必使用sed,因为 bash 具有内置的字符串替换功能。例如,以下将替换变量中的foowith并将其分配给:barjjj

jj=${j//foo/bar}

您的 if 语句也有问题。它应该是:

if [ "$name" == "$name2" ]
于 2013-04-26T08:14:03.167 回答
0

一件小事:Sed 将动作选择器之后的第一个字符视为字段分隔符。知道这一点,您可以翻译您的表达:

sed s/'tRap\/tRapTrain'/'BEEML\/BEEMLTrain'/g

进入:

sed s%'tRap/tRapTrain'%'BEEML/BEEMLTrain'%g

因此,在替换路径时,您不必担心斜线。我通常使用 '%',但可以随意使用任何其他字符。我认为最佳方法是使用不可打印的字符:

SEP=$'\001' ; sed s${SEP}'tRap/tRapTrain'${SEP}'BEEML/BEEMLTrain'${SEP}g
于 2013-09-19T11:51:51.787 回答