使用shell脚本替换不同字符串的文本

时间:2014-08-06 10:43:25

标签: text replace inline alternate

希望有人可以提供协助;

我有一个xml文件,我想在其中搜索特定的字符串,然后在每次找到匹配项时替换为不同的文本。例如,我需要在xml文件中搜索机器标签的所有内容,因此结果看起来类似于;

...
<machine>devbox1.mydomain.com</machine>
...
<machine>devbox2.mydomain.com</machine>
...
<machine>devbox1.mydomain.com</machine>
...
<machine>devbox2.mydomain.com</machine>
...
<machine>devbox1.mydomain.com</machine>
...
...

我现在有4个新系统,我需要将每个devbox *替换为最终类似的东西;

...
<machine>newbox1.mydomain.com</machine>
...
<machine>newbox2.mydomain.com</machine>
...
<machine>newbox3.mydomain.com</machine>
...
<machine>newbox4.mydomain.com</machine>
...
<machine>newbox1.mydomain.com</machine>
...
...

我已经以bash脚本的形式进行了初步尝试,通过构建一个while循环来读取每一行并grep查找所需的字符串,但我不确定这是否是最好的方法呢?

任何提示或指示都将不胜感激。

由于 ç

1 个答案:

答案 0 :(得分:0)

假设每行不能有多个<machine>标记(或者至少不超过一个要替换的标记),这个Python脚本应该可以完成这项工作:

#!/usr/bin/env python

import sys
import re
from itertools import cycle

regex = re.compile('^(.*<machine>)devbox\d+(\.mydomain\.com</machine>.*)$')
box = cycle([1, 2, 3, 4])
for l in sys.stdin:
  m = regex.match(l)
  if m:
    l = m.group(1) + 'newbox' + str(next(box)) + m.group(2)
  print(l)

将其保存到文件(例如newboxer.py)并生成可执行文件,然后您可以使用:

> ./newboxer.py < input.xml > output.xml