我正在使用Python Fabric,尝试对以“@”开头的文件中的所有行进行注释,除非“@”后面跟着2个特定的IP地址。因此,如果文件包含(没有项目符号)
然后生成的文件应该是(也没有项目符号)
这是我到目前为止所做的:
def verify():
output = sudo("/sbin/service syslog status")
#if syslog is running
if 'is running...' in output:
#then set output to the value of the conf file
output = sudo("cat /etc/syslog.conf")
#If pattern is matched
if "@" in output and not "@IP1" and not "@IP2":
#read all the lines in the conf file
sys.stdout = open('/etc/syslog.conf', 'r+').readlines()
#and for every line, comment if it matches pattern
for line in sys.stdout:
if "@" in line and not "@1P1" and not "@IP2":
line = "#" + line
else:
print GOOD
else:
print RSYSLOG
当我说
时,我明白了if "@" in output and not "@IP1" and not "@IP2"
Python认为我说的是“如果文件中有@,那么做一些事情,但只有你没有@ IP1和@ IP2。”我想说的是“对于以@开头的任何行做一些事情,除了@ IP1和@ IP2这些行。”另外我知道我的代码中还有其他错误,但我现在正在研究这个问题。
感谢。
答案 0 :(得分:1)
正则表达式解决方案:
您可以使用以下正则表达式进行匹配:
^(?=@(?!(IP1|IP2)))
并替换为#
请参阅DEMO
代码:
re.sub(r'^(?=@(?!(IP1|IP2)))', r'#', myStr)
答案 1 :(得分:0)
我愿意,
if not "@IP1" in output or not "@IP2" in output:
if output.startswith("@"):
// stuff here
答案 2 :(得分:0)
检查glob中是否存在条件,如果是,则打开文件,逐行读取,并使用re.sub()在需要它的行中添加#inline。
import re
ip1 = '1.1.1.1'
ip2 = '2.2.2.2'
fh = open('in.txt', 'r')
f = fh.read()
fh.close()
if re.search(r'(@(?!({0}|{1})))'.format(ip1, ip2), f):
fh = open('in.txt', 'r')
for line in fh:
line = re.sub(r'^(@(?!({0}|{1})))'.format(ip1, ip2), r'#\1', line)
print(line)
输入文件:
@1.1.1.1
@this
@2.2.2.2
@3.3.3.3
@
no @
blah
输出:
@1.1.1.1
#@this
@2.2.2.2
#@3.3.3.3
#@
no @
blah