尝试使用回车和换行运行子进程命令

0 投票
1 回答
41 浏览
提问于 2025-04-12 01:21

我正在尝试执行一些命令,以从一个文件中去掉无用的输出。我已经找到了必要的命令来做到这一点,不过当我试图通过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)

撰写回答