尝试使用回车和换行运行子进程命令
我正在尝试执行一些命令,以从一个文件中去掉无用的输出。我已经找到了必要的命令来做到这一点,不过当我试图通过Python来自动化这个过程时,发现命令在执行到一半的时候被截断了,因为我想去掉的文本中有一个换行符。
def do_stuff():
count = 0
while True:
try:
count += 1
basic_filename = fn + str(count) + ".txt"
temp_filename = "temp_"+fn + str(count) + ".txt"
final_filename = "final_"+fn + str(count) + ".txt"
finalfinal_filename = "finalfinal_"+fn + str(count) + ".txt"
cmd1 = b"sed -e 's/\\x1b\[[0-9;]*[mK]//g' -e 's/\r//g' -e 's/\\n//g' " + str.encode(basic_filename) + b" > " + str.encode(temp_filename)
cmd1 = base64.b64encode(cmd1)
cmd1 = "echo '"+bytes.decode(cmd1)+"' | base64 -d | bash"
print(cmd1)
except:
break
一个示例输出包括Base64编码的内容。
"c2VkIC1lICdzL1x4MWJcW1swLTk7XSpbbUtdLy9nJyAtZSAncy8NLy9nJyAtZSAncy9cbi8vZycgcmVzdWx0czEudHh0ID4gdGVtcF9yZXN1bHRzMS50eHQ=" which when decoded shows:
"sed -e 's/\x1b\[[0-9;]*[mK]//g' -e 's/
//g' -e 's/\n//g' results1.txt > temp_results1.txt"
1 个回答
0
你不能执行以字节形式存在的操作系统命令。
当然可以。你可以这样运行你的命令,而不是写一个shell脚本:
import subprocess
basic_filename = "example.txt"
with open(basic_filename, "wb") as fd:
fd.write(b"there is no \x1b[12;m escape")
out = subprocess.check_output(
[
b"sed",
b"-e",
b"s/\x1b\\[[0-9;]*[mk]//g",
basic_filename.encode(),
]
)
print(out)
这将会输出:
b'there is no escape'
...成功去掉了转义序列。当然,正如其他人在评论中提到的,没有必要调用sed
来进行这些转换;直接在Python中做就可以了:
import re
re_esc = re.compile(b"\x1b\\[[0-9;]*[mk]")
input_data = b"there is no \x1b[12;m escape"
out = re_esc.sub(b"", input_data)
print(out)