Сед с пробелом в питоне

Я пытался выполнить заменить с помощью Sed в VMkernel, Я использовал следующую команду,

sed s/myname/sample name/g txt.txt

Я получил сообщение об ошибке sed: unmatched '/', Я заменил пространство на \, Это сработало.

Когда я попробовал то же самое с помощью Python,

def executeCommand(cmd):
   process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
   output, error = process.communicate()
   print (output.decode("utf-8")) 
executeCommand('sed s/myname/sample\ name/g txt.txt')

Я получаю ошибку sed: unmatched '/' снова. я использовал \s вместо пробела я получаю имя, замененное на samplesname,

Как я могу заменить строку пробелом?

1 ответ

Решение

Самое простое - не разбираться в разделении команды:

executeCommand(['sed', 's/myname/sample name/g', 'txt.txt'])

В противном случае вы открываете банку с червями, эффективно играя роль парсера оболочки.


В качестве альтернативы вы можете запустить команду в оболочке и позволить ей проанализировать и выполнить команду:

import subprocess

def executeCommand(cmd):
   process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
   # Or:
   # This will run the command in /bin/bash (instead of /bin/sh)
   process = subprocess.Popen(['/bin/bash', '-c', cmd], stdout=subprocess.PIPE)
   output, error = process.communicate()
   print (output.decode("utf-8")) 

executeCommand("sed 's/myname/sample name/g' txt.txt")
Другие вопросы по тегам