如何使用Python shlex解析bash数组?



>输入:

declare -a ForwardPort=([0]="L *:9102:10.0.1.8:9100 # remote laptop" [1]="L *:9166:8.8.8.8:9100 # google")

期望的输出

我想得到这个输出:

{
'ForwardPort': [ 
'"L *:9102:10.0.1.8:9100 # remote laptop"', 
'"L *:9166:8.8.8.8:9100 # google"'
]
}

尝试

我试着玩了一下shlex,但数组的解析很糟糕:

import shlex
line='ForwardPort=([0]="L *:9102:10.0.1.8:9100 # remote laptop" [1]="L *:9166:8.8.8.8:9100 # google")'
lex=shlex.shlex(line)
list(lex)
['ForwardPort', '=', '(', '[', '0', ']', '=', '"L *:9102:10.0.1.8:9100 # remote laptop"', '[', '1', ']', '=', '"L *:9166:8.8.8.8:9100 # google"', ')']

问题

有没有办法自动将ForwardPort的值解析为列表?

注意:不要在家里复制,这是一个糟糕的设计决定,导致了这个复杂的问题:S

你可以用以下方法在bash中打印出来:

#!/bin/bash
declare -a ForwardPort=([0]="L *:9102:10.0.1.8:9100 # remote laptop" [1]="L *:9166:8.8.8.8:9100 # google")
res=$(python -c 'import json, sys; print(json.dumps({"ForwardPort": [v for v in sys.argv[1:]]}))' "${ForwardPort[@]}")
echo "$res"

给:

{"ForwardPort": ["L *:9102:10.0.1.8:9100 # remote laptop", "L *:9166:8.8.8.8:9100 # google"]}

如果你在 Python 中将 bash 数组定义为字符串,你可以尝试这个有点粗糙的解析:

import re
line='ForwardPort=([0]="L *:9102:10.0.1.8:9100 # remote laptop" [1]="L *:9166:8.8.8.8:9100 # google")'
name, arr = line.split('=(')
arr = arr[:-1]  # removing the trailing ')'
lst = [item for item in re.split('[d+]=', arr) if item]
dct = {name: lst}
print(dct)

从 Python 开始,从那里启动 bash(实际上是 hiro 的答案的反面,它从 bash 启动 Python(:

import subprocess
print_array_script=r'''
source "$1" || exit
declare -n arrayToPrint=$2 || exit
printf '%s' "${arrayToPrint[@]}"
'''
def bashArrayFromConfigFile(scriptName, arrayName):
return subprocess.Popen(['bash', '-c', print_array_script, '_', scriptName, arrayName],
stdout=subprocess.PIPE).communicate()[0].split('')[:-1]
print(bashArrayFromConfigFile('file.txt', 'ForwardPort'))

使用按如下方式创建的输入文件进行测试:

cat >file.txt <<'EOF'
declare -a ForwardPort=([0]="L *:9102:10.0.1.8:9100 # remote laptop"
[1]="L *:9166:8.8.8.8:9100  # google")
EOF

。正确发出作为输出:

['L *:9102:10.0.1.8:9100 # remote laptop', 'L *:9166:8.8.8.8:9100  # google']

相关内容

  • 没有找到相关文章

最新更新