2014-08-27 5 views
0

У меня есть текстовый файл, который содержит следующую строкуподпроцесс вызов СЕПГ команда дает ошибку

PIXEL_SCALE  1.0   # size of pixel in arc 

Для замены 1.0 в нем с 0,3 я пытался использовать СЭД через subprocess.call из питона сценария. После команды sed regex отлично работает с оболочкой.

sed -i 's/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/' filename.txt 

Но эквивалентная команда subprocess.call дает мне следующую ошибку.

subprocess.call(['sed','-i',"'s/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/'",'filename.txt']) 

sed: -e expression #1, char 1: unknown command: `'' 

Я попытался преобразовать строку в сырую строку с помощью префикса строки с г, а также пытался .encode («UTF-8»). Но они не имели никакого эффекта. Что здесь может быть неправильно?

Благодаря

+0

попробовать subprocess.Popen ("СЕПГ -i 's/^ \ (PIXEL_SCALE \ s * \) \ ([0-9] * \. [0-9] * \)/\ 10,3 /' filename.txt ", shell = True") – vks

ответ

3

' кавычки являются разделители, используемые оболочкой. Как вы не используете оболочку, вам не нужно их вокруг регулярного выражения:

subprocess.call(['sed','-i',r"s/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/",'filename.txt']) 
#       ^^               ^

Кроме того, я использовал raw string (r"....") для предотвращения интерпретации обратной косой чертой последовательностей питона.

+0

Спасибо. Это сработало. Я попытался как удалить кавычки, так и добавить r отдельно, но не пробовал обе вместе. Спасибо. – indiajoe

0
subprocess.call("sed -i 's/^\(PIXEL_SCALE\s*\)\([0-9]*\.[0-9]*\)/\10.3/' filename.txt", shell=True) 

, который работает

+0

Спасибо. Но чтобы заставить его работать, мне также пришлось суффиктировать строку с помощью r, чтобы предотвратить возможность использования python из \ s в нем. – indiajoe

+0

Добавление 'shell = True' исправляет его, добавляя еще один процесс между вами и вашими данными. Лучшее решение заключается в том, чтобы понять, что происходит, и удалить оболочку из-за осложнений. Лучшим решением по-прежнему будет выполнение этой простой замены в самом Python, который хорошо подходит для этой задачи. – tripleee

0
's/(PIXEL_SCALE\s*)[0-9]+[0-9]+/\10.3/' 
+1

Не могли бы вы включить слова в ваш anwser? earer. – Trudbert

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