![](/img/trans.png)
[英]sed to replace lines matched by a pattern range if one line match a condition
[英]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.