2017-07-01 7 views
2

xargs文字列を置換の中のsed置換に置き換えようとしていますが、ここでは動作しないコードがあります。xargs sedとbashのコマンド置換

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)) 

2回目の置換で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と他のことがあります。何

が含まれていませんoutput2.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 

物事をクリアするが、ステップを取るため@janos応答のおかげでここに戻って、問題の根本は、私が取得するために苦労してるということであると私にはそれが明確になります請求書の払い出しダイナミックに生成されたHTML ".... =" invoiceid7 "value =" 556 "..."ですので、私がgrepできる特定のタグには一貫性がありません。一貫して変数sedを使って基本的にタグ名を推測してから値を抽出しようとします。ループに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 

下記の解決策に関するコメントを読んでください。これを行うにはよりクリーンな方法があります。

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

問題は$(sed ...)xargsの実行中に入力の各行に対して評価されないことである。

答えて

1

あなたの現在のアプローチは、特にこの部分、動作することはできません。 シェルはの前にこれを一度評価し、の前に実際にはxargsを実行します。 入力から動的な値が必要です。

あなたは異なるアプローチを取ることによって、この作業を行うことができます。

  1. は、請求書のIDを抽出します。例えば、単に請求書IDS
  2. のリストは、第二段階のため

が必要-F "invoiceidNUM=..."フォームに請求書一覧を変換出力として生成grepまたはsedパイプラインを書き、Awkのは実用的である可能性があります。 sedステップが生成する場合

curl -b mycookiefile -c mycookiefile http://localhost/calcint.php > output.txt 
args=$(sed ... output.txt | awk '{ print "-F \"invoice" NR "=" $0 "\"" }') 
echo $args 

は、例えば2342年には、456456、78987は、出力は次のようになります:スクリプトは次のようなものかもしれない

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

は理にかなって、それを手に入れたが、私はルートを推測しますここでの問題は、私が請求書IDを取得するのに苦労していることです。ダイナミックに生成されたHTML ".... =" invoiceid7 "value =" 556 "..."ですので、私がgrepできる特定のタグには一貫性がありません。一貫して変数sedを使って基本的にタグ名を推測してから値を抽出しようとします。 – Blinder

+0

@Blinder 'grep -o invoiceid '[0-9] *''はできませんか? – janos

+0

はい、それは私の途中でしか得られません。また、毎回何個の要素があるのか​​分かりません。彼らがDBで仕事をするのはうれしいことですので、私はカールを使って関心を引き上げるために請求書IDのリストを渡すことができましたが、それはすべてクライアントサイドで行われていますので、HTMLを切り捨てる必要があります。最後に私はこのようなループの中でsedを十分に幸せにすることができました: for $(seq $ {CALCLINES}); e = "interest" $ i CALCINT = $ CALCINT '-F "' $ '=' '$ e' = 'CALCINT = $ CALCINT $(sed -n'/'$ e'/s /.* name = "'$ e'" \ s \ + value = "\([^"] \ + \) 。*/\ 1/p 'output.txt)' "'' done – Blinder

関連する問題