首页 > 解决方案 > Python 3 在系统调用中转义引号

问题描述

我正在尝试通过使用 os.system 运行 Awk 命令将文本文件中的新行转换为字符串中的“\n”字符:

awk '{printf "%s\\n", $0}' /tmp/file

我的问题是转义引号不起作用:

$ replace = "awk '{printf \"%s\\n\", $0}' /tmp/file"
$ print(replace)
awk '{printf "%s\n", $0}' /tmp/file

我也尝试过使用 shlex:

$ import shlex
$ line = "awk '{printf \"%s\\n\", $0}'"
$ lexer = shlex.shlex(line, posix=True)
$ lexer.escapedquotes = "'\""
$ mystring = ','.join(lexer)
$ print(mystring)
awk,{printf "%s\n", $0}

我要么需要知道如何使用 Python 运行这个 awk 命令,要么需要知道如何将文件中的回车符/换行符转换为字符串中的“\n”。

编辑:这是一个示例文件:

oneline
twoline

threeline

方法应从该文件返回以下内容:

oneline\ntwoline\n\nthreeline

标签: python

解决方案


在这种情况下,您可以使用原始前缀 + 三重引号:

s = r"""awk '{printf "%s\\n", $0}' /tmp/file"""
print(s)

结果:

awk '{printf "%s\\n", $0}' /tmp/file

所以os.system(s)有效。

在纯python中,用文字替换换行符\n(改编自我的另一个答案):

with open(file1,"rb") as f:
   contents = f.read().replace(b"\n",b"\\n")
with open(file1+".bak","wb") as f:
   f.write(contents)
os.remove(file1)
os.rename(file1+".bak",file1)

推荐阅读