Python子流程中的特殊字符问题

Python子流程中的特殊字符问题,python,awk,subprocess,Python,Awk,Subprocess,我把这个bash翻译成一行: awk '/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1' filename2 > filename1 在这个Python代码中 with open('filename1', 'w') as f: call(['awk', '/\\\]:$/{pno=NR;prec=$0;next} pno &&

我把这个bash翻译成一行:

awk '/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1' filename2 > filename1  
在这个Python代码中

with open('filename1', 'w') as f:
    call(['awk', '/\\\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1', 'filename2'], stdout=f)  
但是,输出文件是空的,并且在我使用bash时不是空的

为此:

call(['awk', r"'/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1'"], stdout=f)
我明白了

awk:'/]:$/{pno=NR;prec=$0;next}pno&!(/^I/&&NR==pno+1){打印 prec;pno=0}1'awk:^表达式中的字符“”无效

示例输入文件:

Interval: [ some_value some_value1]:
Interval: [ some_value some_value2]:
some text here1 
some text here2
some text here3
some text here4
Interval: [ some_value some_value3]:
Interval: [ some_value some_value4]:
Interval: [ some_value some_value5]:
Interval: [ some_value some_value6]:
some text here5
some text here6
some text here7
some text here8
Interval: [ some_value some_value7]:
Interval: [ some_value some_value8]:
示例输出文件:

Interval: [ some_value some_value2]:
some text here1
some text here2
some text here3
some text here4
Interval: [ some_value some_value6]:
some text here5
some text here6
some text here7
some text here8

我打赌你的字符串转换有问题。Python版本提供:

>>> print('/\\\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1')
/\\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1
而shell版本则提供了

$ echo '/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1'
/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1
您可以使用原始字符串表示法简化此类内容:

>>> print(r'/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1')
/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1
从文件中:

当出现
r
r
前缀时,反斜杠仍然用于引用以下字符,但所有反斜杠都保留在字符串中。例如,字符串文字r“\n”由两个字符组成:反斜杠和小写字母“n”。字符串引号可以用反斜杠转义,但反斜杠仍保留在字符串中;例如,r“\”是由两个字符组成的有效字符串文字:反斜杠和双引号

因此,为了你的命令:

call(['awk', r'/\]:$/{pno=NR;prec=$0;next} pno && !(/^I/ && NR==pno+1){print prec; pno=0} 1', filename2], stdout=f)

对于此类字符串,请使用原始字符串表示法:
r“abc\def“
。它可以防止错误,并降低理解所写内容的总体复杂性。开头和结尾的单引号
不是实际字符串的一部分,bash会删除它们。你也必须删除它们。我需要一个报价。如果是原始文字,为什么要删除它们?@Bob:它们不是字符串的一部分。不要混淆文本和对应的字符串对象:内存中没有原始字符串——原始字符串文本只是在Python源代码中指定字符串的符号awk@Bob:awk在shell中调用时也看不到单引号——shell将删除引号。