0

私は bash スクリプトの初心者で、問題に直面しています。ファイル「script.sh」を作成しました。テンプレート ファイルを開いて、特定の属性を別の値に置き換えたいと考えています。これが私のスクリプトです。誰かが問題を教えてくれれば幸いです..

#!/bin/bash
TEMPLATEFILE="Template.xml"
XMLDir="Results"
OUTPUTDir="Output"
TIMES=2 
QUAN=50
DIST=150
OUTPUT_File="Output_"
mkdir  $XMLDir      
mkdir  $OUTPUTDir   
rm -rf $XMLDir      
rm -rf $OUTPUTDir   
echo $TIMES
x=1
echo ${x}
while [ $x -le $TIMES ]
do
    RANDOMVAR =${Random}
    outputFile=${OUTPUT_File}"_"${QUAN}"_"${RANDOMVAR}"_"${DIST}".xml"
    outputText=${OUTPUT_File}"_"${QUAN}"_"${RANDOMVAR}"_"${DIST}".txt"
    touch ${outputFile}  
        sed -e "s/$SEEDVALUE/$RANDOMVAR/"
            -e "s/$EXPIREMENT/$QUAN/"
            -e "s/$DISTANCE/$DIST/"
            -e "s/$OUTPUTFILE/$outputText/"
            < $TEMPLATEFILE > $outputFile
    echo $outputFile" is generated in "$x" iteration out of "$TIMES
    x=$(( $x + 1 ))
done
echo "done"

ターミナルでファイルを実行します:bash script.sh

xml ファイルには多くの行が含まれていますが、次の行を変更しようとしています。

<run length="0" seed_value="SEEDVALUE" />
<outputfileName name="expirement" output="OUTPUTFILE" />
<distancevalue value="DISTANCE" />
<entity number="EXPIREMENT" base_num="1">

スクリプトを実行すると、「予期しないファイルの終わり」が表示されます

4

3 に答える 3

1

sed -e "s/$SEEDVALUE/$RANDOMVAR/"

このコマンドは、変数「$SEEDVALUE」を取得して「$RANDOMVAR」に置き換えていますが、SEEDVALUE を何かに設定することはありません。発行している実際のコマンドは次のようになります。

sed -e "s//$RANDOMVAR/"

私の文字列置換プレースホルダーでは、通常、「ハンドルバー」{{ }} を使用して目立つようにしています。

代わりにこれを試してください:

まず、テンプレート ファイルにプレースホルダー {{SEEDVALUE}} が含まれていることを確認してください。次に、最初のリダイレクト「<」を行う必要はありません。単純にファイルを渡すだけで、sed はファイルに作用します。

これは、物事をより明確にするのに役立つ非常に単純化されたバージョンです。

echo "This is some line. This is what was replaced with my placeholder: {{SEEDVALUE}}" > /tmp/testfile

RANDOMVAR="my new text"

sed -e "s/{{SEEDVALUE}}/$RANDOMVAR/" /tmp/testfile > /tmp/testfile-replaced

cat /tmp/testfile-replaced
于 2013-08-06T14:32:26.087 に答える
0

これらの sed コマンドの引数が同じ行になく、行シフトがエスケープされていないように見えます。試す:

sed -e "s/$SEEDVALUE/$RANDOMVAR/" \
    -e "s/$EXPIREMENT/$QUAN/" \
    -e "s/$DISTANCE/$DIST/" \
    -e "s/$OUTPUTFILE/$outputText/" \
    < $TEMPLATEFILE > $outputFile

また、より多くのデバッグ情報を取得するには、次をインタープリターとして使用すると便利なことがよくあります。

#!/bin/bash -x
于 2013-08-06T12:06:29.947 に答える