Python awk、sprintf 语句语法错误(2.7)

Python awk、sprintf 语句语法错误(2.7)

我正在尝试将其中一个 shell 命令用于 python 脚本,但这里遇到了一些语法错误。

该命令的描述是从这里

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

此命令在终端上运行良好,但尝试将其导入 python 脚本

import subprocess
cmd = "/dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/""
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
out, err = p.communicate()
print out
print err

sprintf 语句出现语法错误,该错误没有太多解释,或者不像模数 (%)

答案1

  • 你不能在“内”使用“。你的命令被分成几部分

    cmd = "
    /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk 
    | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' 
    | head -n 2 
    | awk '{$1 = sprintf("%03d", $1); print}'` 
    | tr " " "/"
    "
    

第 1 行和第 7 行的“”与第 5 行和第 6 行的“”相冲突。您需要对它们进行转义。第 3 行正确地对它们进行了转义。

查看字符串文字部分。

  • 未经测试,但您可能需要这样做:

    cmd = "
    /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk 
    | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' 
    | head -n 2 
    | awk '{$1 = sprintf(\"%03d\", $1); print}'` 
    | tr \" \" \"/\"
    "
    

也许这也有效:

cmd = "/dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf('%03d', $1); print}'` | tr ' ' '/'"

我把“ 改成了 ’ 。

相关内容