在Python中操作stdin并重定向到stdout

时间:2014-10-22 16:12:54

标签: python python-2.7

我正在尝试编写一个简单的python脚本

  1. 从stdin
  2. 获取值
  3. 替换特定的匹配词
  4. 将带有NEW值的输出传递回stdout
  5. 我只有从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
    

    foo的内容

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

    理想情况下,如果我运行此命令

    cat foo | ./test.py
    

    我会得到类似的东西

    <something>NEWWORD</something
    <blah>UNTOUCH</blah>
    

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

另外,作为pythonic方式,您可以使用ElementTree XML API