2013-08-06 5 views
0

Я начинающий в сценарии bash, и перед вами стоит проблема. Я создал файл «script.sh», и я хочу открыть файл шаблона и заменить определенные атрибуты разными значениями. Вот мой сценарий, и я признателен, если кто-то сказать мне, что это проблема ..Редактировать файл в bash-скрипте командой sed

#!/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" 

я запускаю файл в терминале с помощью: Баш script.sh

Файл XML содержит много строк, но Я пытаюсь изменить следующие параметры:

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

При запуске сценария, он дает мне «неожиданный конец файла»

+0

Remove пространство после имени переменной в присваивании: «RANDOMVAR ='. В противном случае shell пытается запустить команду 'RANDOMVAR' с' = 'в качестве аргумента. – choroba

+0

Спасибо, я сделал, но все еще имею ту же проблему – Yasmin

+0

Это работает для меня. Вы уверены, что показываете полный код? – choroba

ответ

1

СЕПГ -e "s/$ SEEDVALUE/$ RANDOMVAR /"

Эта команда принимает переменную "$ SEEDVALUE" и заменив его «$ RANDOMVAR», но вы никогда не устанавливаете SEEDVALUE на что-либо. Фактическая команда, которая выдает выглядит так:

СЕПГ -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 
0

кажется мне, как эти SED команды аргументы не на одной линии и сдвиг линии не экранирован. Попробуйте:

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

Кроме того, чтобы получить больше информации отладки, часто полезно использовать следующие в качестве переводчика:

#!/bin/bash -x 
+0

Я попробовал только один sed -e «s/$ SEEDVALUE/$ RANDOMVAR /», но никогда не работал – Yasmin

0

Не уверен, что вы делаете. Я не думаю, что определена переменная $ SEEDVALUE.

Я думаю, что ваша СЭД команда должна начинаться немного больше, как это

sed -e "s/seed_value=\"[0-9]*\"/seed_value=\"$RANDOMVAR\"/g" 
+0

Я пробовал ваше решение, но оно не работает, можете ли вы написать полную строку команды sed? – Yasmin

Смежные вопросы