2015-07-15 2 views
1

Итак, я использую Bash для вызова скрипта python synFlood для класса. Я хочу включить пользовательский ввод в это, поэтому я использовал Bash (так как мне не разрешалось использовать python). Я назвал свой источник и целевые IP-адреса от пользователя и сохранил их, а затем создал новую переменную для всей строки внутри скрипта python для замены sed.Bash SED, чтобы заменить строку в файле

В настоящее время моя команда работает и заменяет строку. Но когда я заканчиваю скрипт, строка, которую я сказал заменить, по-прежнему является исходной строкой.

Пример:

sourcepath="src = $source" #set user source IP to full path for python script 
targetpath="tgt = $target" #set user target IP to full path for python script 

sed -e "s/^src.*/$sourcepath/" #replace the src string with sourcepath variable 
sed -e "s/^tgt.*/$targetpath/" #replace the tgt string with targetpath variable 

python syn.py 

Sed заменяет обе строки в моем питона файл на что указывает пользователь; как он показывает это в окне терминала (для тестирования в любом случае окончательный скрипт скроет этот вывод). Но когда я проверяю файл после завершения сценария, ничего не изменилось, и значения по умолчанию все еще существуют.

Действительно ли sed просто изменяет значения только в контексте сценария во время его работы? Если это так, когда я вызываю скрипт python в следующей строке, он будет использовать значения, находящиеся в данный момент там из моих изменений sed, или он будет использовать файлы по умолчанию в сценарии python?

Заранее благодарим за помощь и разъяснение.

ответ

0

Этот фрагмент явно не является вашим оригинальным сценарием, так как он не работает. Команды sed не имеют данных для работы (нет стандартного ввода и аргумента имени файла).

Предполагая, что вы на самом деле есть что-то еще вроде этого:

sed -e "s/^src.*/$sourcepath/" syn.py #replace the src string with sourcepath variable 
sed -e "s/^tgt.*/$targetpath/" syn.py #replace the tgt string with targetpath variable 

то проблема, что вы на самом деле не изменяя файл на диске. У вас просто есть sed, прочитав файл и переплетая измененное содержимое в стандартный вывод.

Необходимо изменить его на файл (не тот, который не работает) или использовать флаг -i, чтобы сообщить sed, чтобы изменить файл «на месте».

+0

Извините, если это сбивает с толку, я просто взял фрагмент кода, а не размещал здесь все строки кода. – undecisive

1

sed команда не изменяет файлы. Он считывает их и копирует их на стандартный вывод с внесенными изменениями, но исходный файл не тронут.

Если у вас есть версия ГНУ sed, есть флаг можно включить, чтобы включить в месте модификации: sed -i.bak s/old/new/ filename модифицирует файл (после создания резервной копии) вместо того, чтобы просто сделать копию на стандартный вывод с изменениями ,

Если у вас нет версии GNU, вы можете перенаправить вывод в файл и скопировать его на место:

cp -p filename filename.bak 
sed -e s/old/new/ filename.bak >filename 
+2

Обратите внимание, что 'sed -i' does ** не создает резервную копию; он делает это, только если вы укажете 'sed -i [SUFFIX]'. Испытайте команду 'sed' без' -i', пока вы не убедитесь, что у вас все получилось ... – DevSolar

+0

Ах, теперь это имеет смысл. Я просто попробовал его с ключом -i и объявил .bak, и это сработало, но я столкнулся с несколькими проблемами, пытаясь заставить одиночные кавычки работать. вместо того, чтобы делать тонну побегов, я поменялся на \ x27, и он работал безупречно. Спасибо за разъяснение того, как sed печатает в stdout, а не в файл без ключа -i. – undecisive

+0

Пожалуйста, «примите» ответ, если он решил вашу проблему, @undecisive .. просто установите флажок (на этот и любой из ваших других вопросов, которые получили полезные ответы). –

0

Говоря

sed -e "..." file 

вы выполняете замену и вывод выводится на экран (stdout). Это поведение по умолчанию sed.

Если вы хотите, чтобы файл обновлялся с новым контентом, вы должны указать его.Для этого у вас есть два варианта:

  • на месте монтажа

    sed -i.bak "..." file 
    

это будет заменить файл и создать file.bak резервную копию файла с исходным содержанием. Проверьте man sed, потому что в зависимости от дистрибутивов синтаксис может отличаться (OSX или GNU). В основном, в OSX вам нужно сказать sed -i '', если вы не хотите создавать резервный файл. См. In-place edits with sed on OS X для более подробной информации.

  • Перенаправление на другой файл:

    sed "..." file > tmp_file && mv tmp_file file 
    

То есть, вместо печати на стандартный вывод, при печати на временный файл, который затем получает переименованный к первоначальному.

+0

Благодарим вас за разъяснение в том, как он работает и для обеспечения двух способов выполнения задачи записи изменений в файл. Я использовал ключ -i, потому что думал, что в скрипте будет проще и меньше кода. – undecisive

+0

Приятно читать это, @undecisive Помните, что вы можете принять ответ, если он сработает с вами. – fedorqui

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