我有一个包含shell命令的文件。每个命令可以分为多行(末尾使用反斜杠):例如
cmd1 -opt1 \
-opt2 val2 \
-opt3 val3 val4
如果结尾处用反斜杠分隔,我想加入连续的行。我也想在加入后删除反斜杠。
问题类似于:输入:['abc','def \\','ghi \\','jkl','yyy \\','zzz']输出:['abc','def ghi jkl','yyy zzz']
正在遍历仅列表解决方案?
with open("cmd", "r") as fp:
cmd = ""
cont = False
list = []
for line in fp:
line = line.rstrip("\n")
if line.endswith('\\'):
line = line[:-1]
if cont:
cmd = cmd + line
continue
if cmd:
list.append(cmd)
cmd = line
cont = True
else:
if cont:
cmd = cmd + line
if cmd:
list.append(cmd)
cmd = ""
continue
cont = False
print(list)
cmd = ['abc','def \\','ghi \\','jkl','yyy \\','zzz']
res =“ \ n” .join(cmd).replace(“ \\\ n”,“”).splitlines()
打印(res)
=> ['abc','def ghi jkl','yyy zzz']
线索
正在遍历仅列表解决方案?
您将必须评估每一行的连接指示符并追加下一行。是的,您必须循环浏览。
这是一个使用生成器执行此操作的函数,因此整个输入不需要存储在内存中。
>>> sample = ['abc', 'def \\', 'ghi \\', 'jkl' , 'yyy \\', 'zzz']
>>>
>>> def join_lines(sequence):
... i = iter(sequence)
... buff = ''
... try:
... while True:
... line = i.next()
... if line.endswith('\\'):
... line = line[:-1]
... buff += line
... else:
... if buff:
... buff += line
... yield buff
... buff = ''
... else:
... yield line
... except StopIteration:
... if buff:
... yield buff
...
>>> print sample
['abc', 'def \\', 'ghi \\', 'jkl', 'yyy \\', 'zzz']
>>> print list(join_lines(sample))
['abc', 'def ghi jkl', 'yyy zzz']
这可以是连接行并在这样的文件上进行迭代的方法:
with open("cmd", "r") as fp:
data = fp.read()
lines = data.replace("\\\n", "").splitlines()
lines = [ x + "\n" for x in lines ]
for line in lines:
print(line)