簡體   English   中英

使用sed在python中用多行替換單個行模式

[英]Replace a single line pattern by multiple lines in python using sed

這是在test.txt中

swift-ring-builder account.builder add zZONE-STORAGE_LOCAL_NET_IP:6002/DEVICE 100

我想用sed在python中用多行替換上面的行,以便上面的行變成:

swift-ring-builder account.builder add z1-10.0.0.2:6002/sda 100
swift-ring-builder container.builder add z1-10.0.0.2:6001/sda 100
swift-ring-builder object.builder add z1-10.0.0.2:6000/sda 100

我用了:

import subprocess

def search_and_replace_pattern(oldstr, newstr, path):
    subprocess.call(['sed', '-i', 's#'+oldstr+'#'+newstr+'#', path])

但是我得到了:

sed: -e expression #1, char 88: unterminated `s' command

在子流程中,我使用#因為我的模式包含/ ,所以我使用#分隔符,以使sed不會與/混淆。

請提出使用subprocess或其他任何方法(例如os.system(cmd)的解決方案

不要使用sed ; 使用fileinput模塊代替文件中的行:

import fileinput
import sys

for line in fileinput.input(filename, inplace=True):
    if line.strip() == 'swift-ring-builder account.builder add zZONE-STORAGE_LOCAL_NET_IP:6002/DEVICE 100':
        sys.stdout.write(
            'swift-ring-builder account.builder add z1-10.0.0.2:6002/sda 100\n'
            'swift-ring-builder container.builder add z1-10.0.0.2:6001/sda 100\n'
            'swift-ring-builder object.builder add z1-10.0.0.2:6000/sda 100\n'
        )
    else:
        sys.stdout.write(line)

這將遍歷以filename命名的filename ,並按原樣重寫每一行,除非該行等於'swift-ring-builder account.builder add zZONE-STORAGE_LOCAL_NET_IP:6002/DEVICE 100' ,在這種情況下,三個不同行被寫。

您可以使用正則表達式替換oldstr的相關行:

pattern = r'^(swift-ring-builder )account(.builder add )zZONE-STORAGE_LOCAL_NET_IP:6002/DEVICE 100$'
replacement = '\\g<1>account\\g<2>z1-10.0.0.2:6002/sda 100\n' \ 
              '\\g<1>container\\g<2>z1-10.0.0.2:6001/sda 100\n' \
              '\\g<1>object\\g<2>z1-10.0.0.2:6000/sda 100\n'
newstr = re.sub(pattern, replacement, oldstr)

看一下re模塊文檔

編輯。 但是對於這個簡單的任務,我個人更喜歡Martijn Pieters的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM