“等待除特定 usbmodem 之外的所有内容”zsh 正则表达式

“等待除特定 usbmodem 之外的所有内容”zsh 正则表达式

我正在为相互通信的不同设备编写固件,它们都通过 USB 连接到我的 Mac。我正在使用zsh。第一个始终处于打开状态/dev/tty.usbmodem1,出于某些愚蠢的 Mac 原因,每个下一个设备都将使用随机调制解调器号码。假设第二个处于打开状态/dev/tty.usbmodem11
我正在使用以下命令上传我的固件:

tools/uploader.py --port='/dev/tty.usbmodem*' Images/image.file 

如果它在 usbmodem 下找不到任何设备,它将等待第一个设备出现。

我想要的是让正则表达式--port=返回任何东西 /dev/tty.usbmodem1

能够在仍连接到第一台设备(始终处于打开状态usbmodem1)的情况下将固件上传到第二台设备。
我尝试过:

tools/uploader.py --port='/dev/tty.usbmodem* | egrep \"usbmodem1$\" -v' Images/image.file

但是如果我在该脚本等待设备时插入设备,它就不起作用。(正如我上面写的,脚本可以使用第一个命令等待设备)。

答案1

在评论中你确认命令行如下

tools/uploader.py --port=/dev/tty.usbmodem2 --port=/dev/tty.usbmodem3 Images/image.file

正在工作。为了写一个更通用的答案,我将其融化为

echo foo --bar=file2 --bar=file3 ...

每个人都可以通过复制和粘贴进行测试。所以,我想到了两种 zsh'ish 方法。

  1. 使用构造方案fileN,其中N的数字从 2 开始直到 5。然后您可以使用括号扩展:

    $ echo foo --bar=file{2..6}
    foo --bar=file2 --bar=file3 --bar=file4 --bar=file5 --bar=file6
    

    这不关心它是否fileN实际上是一个文件或者是否存在。它只是一个文本。

  2. 使用 glob 限定符P,它添加一个字符串(例如以 分隔:)到通配符模式的结果(file*):

    $ echo foo file*(P:--bar:)
    foo --bar file1 --bar file2 --bar file3 --bar file4 --bar file5 --bar file7
    

    即结果取决于存在哪些文件,在我的例子中file1file5file7

    但是等一下,您想要排除file1,因此将 glob 模式修改为,file(^1)它是的缩写file(*^1),应该读作file* 但不是(^)file1

    $ echo foo file(^1)(P:--bar:)
    foo --bar file2 --bar file3 --bar file4 --bar file5 --bar file7
    

    或者使用file<2->,从file2下往上匹配:

    $ echo foo file<2->(P:--bar:)
    foo --bar file2 --bar file3 --bar file4 --bar file5 --bar file7
    

    请注意,此 glob 限定符会在前缀后插入一个空格。这可能是一个问题,但我也想包含这种方法,因为它通常非常方便。

相关内容