bash中的xargs sed和命令替换

bash中的xargs sed和命令替换,bash,shell,sed,grep,xargs,Bash,Shell,Sed,Grep,Xargs,我试图将一个xargs字符串替换传递到替换中的一个sed替换中,下面是不起作用的代码 CALCINT=$CALCINT$(seq $CALCLINES | xargs -Iz echo $CALCINT' -F "invoiceid'z'="'$(sed -n '/invoiceid'z'/s/.*name="invoiceid'z'"\s\+value="\([^"]\+\).*/\1/p' output.txt)) 在第二次换人之前,一切都正常。“z”应该是基于$CALCLINES变量的数

我试图将一个xargs字符串替换传递到替换中的一个sed替换中,下面是不起作用的代码

CALCINT=$CALCINT$(seq $CALCLINES | xargs -Iz echo $CALCINT' -F "invoiceid'z'="'$(sed -n '/invoiceid'z'/s/.*name="invoiceid'z'"\s\+value="\([^"]\+\).*/\1/p' output.txt))
在第二次换人之前,一切都正常。“z”应该是基于$CALCLINES变量的数字1-20。我知道这与sed无法正常逃逸有关,但我很难理解sed在这种情况下希望如何逃逸

以下是周围的代码行:

curl -b mycookiefile -c mycookiefile http://localhost/calcint.php > output.txt
CALCLINES=`grep -o 'class="addinterest"' output.txt | wc -l`
CALCINT=$CALCINT$(seq $CALCLINES | xargs -Iz echo $CALCINT' -F "invoiceid'z'="'$(sed -n '/invoiceid17/s/.*name="invoiceid17"\s\+value="\([^"]\+\).*/\1/p' output.txt))
echo $CALCINT
输出:(我现在得到的)

我希望看到的输出是这样的

-F "invoiceid1=2342" -F "invoiceid2=456456" -F "invoiceid3=78987" ...etc etc
-------------------------编辑-----------------------

FWIW…这是output.txt和其他我尝试过的东西

for i in $(seq -f "%02g" ${CALCLINES});do
sed -n "/interest$i/s/.*name=\"interest$i\"\s\+value=\"\([^\"]\+\).*/\1/p" output.txt > output2.txt
done
output2.txt不包含任何内容

感谢@janos的回复,让我把事情弄清楚了,但退一步告诉我,问题的根源在于我正在努力获取发票ID。它是动态生成的HTML“…name=“invoiceid7”value=“556”…”因此,我可以对这些特定的标记进行grep,这就是为什么我要计算另一个一致的标记,然后尝试使用变量sed来基本推断标记名,然后提取值

Annd..output.txt

------更新----- 工作溶液

把东西塞进一个循环。请注意,我如何使用“在sed字符串中使用变量”。这在此处的其他地方有很好的记录。:)


请通读下面对解决方案的评论,有一种更干净的方法可以做到这一点

您当前的方法无法工作,特别是这一部分:

... | xargs -Iz echo -F "invoiceid'z'="$(sed ...)"
问题是在执行
xargs
期间,不会对输入中的每一行计算
$(sed…
)。 shell将在实际运行
xargs
之前对此进行一次评估。 您需要从输入中获得动态值

您可以通过采取不同的方法来实现这一点:

  • 提取发票ID。例如,编写一个
    grep
    sed
    管道,只生成发票ID列表作为输出
  • 将发票列表转换为所需的
    -F“invoiceidNUM=…”
    表单
  • 对于第二步,Awk可能是实用的。脚本可以是这样的:

    curl -b mycookiefile -c mycookiefile http://localhost/calcint.php > output.txt
    args=$(sed ... output.txt | awk '{ print "-F \"invoice" NR "=" $0 "\"" }')
    echo $args
    
    例如,如果
    sed
    步骤产生234245678987,则输出将为:

    -F "invoice1=2342" -F "invoice2=456456" -F "invoice3=78987"
    

    明白了,这是有道理的,但我想问题的根源在于我正在努力获取发票ID。它是动态生成的HTML“…name=“invoiceid7”value=“556”…”因此在我可以使用的特定标记中没有任何一致性,这就是为什么我计算另一个一致的标记,然后尝试使用一个变量sed来基本推断标记名,然后提取值。@Blinder难道你不能只做
    grep-o invoiceid'[0-9]*'
    ?是的,但这只是我的一半。另外,我不知道每次会有多少元素。如果他们能在数据库中完成这项工作,那就太好了,这样我就可以使用curl传递发票ID列表以收取利息,但这一切都是在客户端完成的,所以我不得不切掉HTML。最后,我能够在这样一个循环中让sed足够快乐:因为I在$(seq${CALCLINES});do e=“interest”$i CALCINT=$CALCINT'-F“$e'='CALCINT=$CALCINT$(sed-n'/'$e'/s/*name=“'$e'\s\+value=“([^“]\+)./\1/p'output.txt]”done@Blinder如果您共享一个示例输入和从中提取的所需ID列表,我怀疑可以使用更简单的
    sed
    完成,而不需要循环。但这值得单独提一个问题。如果你(或其他人)有冒险的感觉,上面的pastebin链接就是示例输入。目标是获取所有输入标记名interestX invoiceidX和curX的值属性。X从1开始,然后根据软件输出的结果变为无穷大。这个项目还在进行中,但这个问题已经解决了
    curl -b mycookiefile -c mycookiefile http://localhost/calcint.php > output.txt
    args=$(sed ... output.txt | awk '{ print "-F \"invoice" NR "=" $0 "\"" }')
    echo $args
    
    -F "invoice1=2342" -F "invoice2=456456" -F "invoice3=78987"