Python 3中如何在系统调用中转义引号?

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:

我也尝试使用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"。这是一个关于IT技术的问题。以下是一个示例文件:
oneline
twoline

threeline

以下是该文件应返回的方法内容:
oneline\ntwoline\n\nthreeline

2
这个行不通吗?replace = "awk '{printf \"%s\\\\n\", $0}' /tmp/file" - Eypros
1
那个有效了...我停在了三个反斜杠...没想到第四个会有用 :) - Ken J
你想用单个字符 '\n' ('\0a') 还是两个字符 '\\' 'n' ('\x5d\x6e') 替换行尾? - Serge Ballesta
1个回答

2

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

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)

你的纯Python方法并没有将文件连接起来,而是在应该连接的地方添加了一堆"\n"。例如文件: asd ffd你的方法创建了这个: asd\n ffd\n \n但它应该创建这个: asdffd\n - Ken J
你能否编辑你的问题,以便查看输入和期望的输出?因为在评论中不太清楚。 - Jean-François Fabre
添加了一个带有预期输出的例子 - Ken J
一般来说,从Python调用awk或sed并不是一个很好的主意,因为这会使您的脚本不可移植,并执行系统调用,这会打破异常链,而所有这些都可以在纯Python中更简单地完成。谢谢。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接