Вам действительно не нужен Awk или sed
для этого.Python может делать эти вещи естественным образом, элегантно, гибко, надежно и естественно.
import sys
import re
r = re.compile(r'regex')
s = re.compile(r'old')
with open(sys.argv[1]) as input:
for line in input:
if r.search(line):
print(s.sub('new', line))
Если вы действительно хотите использовать подпроцессы для чего-то, просто используйте общие функции Python для интерполяции строк, где вам нужно вставить значениепеременной Python в строку.
import subprocess
import sys
import shlex
result = subprocess.run(
"""awk '/regex/ {print}' {} |
sed 's/old/new/g'""".format(shlex.quote(sys.argv[1])),
stdout=subprocess.PIPE,
shell=True, check=True)
print(subprocess.stdout)
Но на самом деле не делайте этого.Если вы действительно не можете избежать подпроцесса, сделайте его как можно более простым (избегайте shell=True
и снимите все части, которые могут быть выполнены в Python).