2014-10-22 3 views
0

Я пытаюсь написать простой скрипт, питон, гдеМанипулирование стандартного ввода и перенаправить стандартный вывод в Python

  1. он принимает значения из стандартного ввода
  2. заменяет конкретное подходящее слово
  3. пассов на выходе с NEW value back to stdout

У меня есть только часть, где он принимает значения из stdin и ищет соответствующие слова, после чего я немного застрял.

import re 
import sys 

for line in sys.stdin: 
    matchObj = re.search(r'<something>(.*)</something>',line) 
    if matchObj: 
     oldWord = matchObj.group(1) 
     print oldWord 

Содержание обув

<something>REPLACEME</something> 
<blah>UNTOUCH</blah> 

В идеале, если я запускаю эту команду

cat foo | ./test.py 

я бы что-то вроде этого

<something>NEWWORD</something 
<blah>UNTOUCH</blah> 
+0

RTFM ['re.sub()'] (https://docs.python.org/2/library/re.html?highlight=re.sub#re.sub). –

ответ

1

Вы ищете re.sub?

import re 
import sys 

for line in sys.stdin: 
    sys.stdout.write(re.sub(r'(<something>)REPLACEME(</something>)', 
          r'\1NEWWORD\2', 
          line)) 

Запуск выше на вашем примере данных:

$ echo '<something>REPLACEME</something>\n<something>UNTOUCH</something>' | python2 test.py 
<something>NEWWORD</something> 
<blah>UNTOUCH</blah> 

Обратите внимание, что синтаксический анализ XML с помощью регулярных выражений, вероятно, плохая идея. Стандартная библиотека Python поставляется с number of XML modules.

Вот пример:

import sys 
import xml.etree.ElementTree 

tree = xml.etree.ElementTree.parse(sys.stdin) 
root = tree.getroot() 

for node in root.iter('something'): 
    if node.text == 'REPLACEME': 
     node.text == 'NEWWORD' 

tree.write(sys.stdout) 

выше будет работать точно так же:

$ echo '<root><something>REPLACEME</something>\n<blah>UNTOUCH</blah></root>' | python2 test.py 
<root><something>REPLACEME</something> 
<blah>UNTOUCH</blah></root> 
0

пихты при запуске cat foo | ./test.py вы получили test.py: command not found, вам нужно запустить это: cat foo |python ./test.py.

то выходной код будет:

REPLACEME 

но для вывода, что вы хотите, вы должны использовать re.sub():

import re 
import sys 

for line in sys.stdin: 
    matchObj = re.sub(r'<something>(.*)</something>','<something>NEWWORD</something>',line) 
    if matchObj: 
     print matchObj 

выход:

<something>NEWWORD</something> 

<blah>UNTOUCH</blah> 

Также в качестве питонического способа вы можете использовать ElementTree XML API