bash中的xargs sed和命令替换
我试图将一个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变量的数
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
之前对此进行一次评估。
您需要从输入中获得动态值
您可以通过采取不同的方法来实现这一点:
grep
或sed
管道,只生成发票ID列表作为输出-F“invoiceidNUM=…”
表单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"