在bash中使用xargs sed和命令替换

时间:2017-07-01 16:43:04

标签: 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))

直到第二次替换内的sed一切正常。 ' 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=" -F "invoiceid2=" -F "invoiceid3=" -F "invoiceid4=" -F "invoiceid5=" -F "invoiceid6=" -F "invoiceid7=" -F "invoiceid8=" -F "invoiceid9=" -F "invoiceid10=" -F "invoiceid11=" -F "invoiceid12=" -F "invoiceid13=" -F "invoiceid14=" -F "invoiceid15=" -F "invoiceid16=" -F "invoiceid17=" -F "invoiceid18=" -F "invoiceid19=" -F "invoiceid20="

我希望看到输出是这样的

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

------------------------- EDIT --------------------- -

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回复澄清事情,但退后一步让我清楚地知道问题的根源在于我努力让发票出来。它是动态生成的HTML" .... name =" invoiceid7"值=" 556" ..."所以我可以在这些特定的标签中找不到任何一致的东西,这就是为什么我在计算另一个IS一致的标签然后尝试使用变量sed基本上推断标签名称然后提取值。

Annd..output.txt https://pastebin.com/ewUaddVi

------ ----- UPDATE 工作解决方案

东西塞进一个循环。请注意我必须使用'在sed字符串中使用变量。这在其他地方有详细记载。 :)

for i in $(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

请仔细阅读以下解决方案的评论,有一种更简洁的方法。

1 个答案:

答案 0 :(得分:1)

您当前的方法不起作用,特别是这一部分:

... | xargs -Iz echo -F "invoiceid'z'="$(sed ...)"

问题是在执行$(sed ...)期间,不会为输入中的每一行评估xargs。 shell将评估此次,之前它实际运行xargs。 你需要输入动态值。

您可以采用不同的方法来完成这项工作:

  1. 提取发票ID。例如,编写一个grepsed管道,仅生成发票ID列表作为输出
  2. 将发票清单转换为您需要的-F "invoiceidNUM=..."表单
  3. 第二步,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步骤生成2342,456456,78987,则输出将为:

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