某些制表符在 shell 脚本中不匹配,但在命令行上匹配

CERTAIN tab characters don't match in shell scripts, but do on command-line

我正在尝试对 shell 脚本中 xinput 命令的输出进行一些简单的解析。我正在尝试做的事情在命令行上完美运行,但在脚本中不起作用。

这是我的命令行:

xinput list | awk '/Name of my Device   id[0-9]*    \[slave pointer/'

上一条命令的输出:

⎜   ↳ Name of my Device      id=12   [slave  pointer  (2)]

出现提示时,我通过按 CTRL-V,TAB 输入制表符。在脚本中,我输入了一行:

xinput list | awk '/Name of my Device   id[0-9]*/'

其中returns三行数据。只要我添加另一个标签,就像这样:

xinput list | awk '/Name of my Device   id[0-9]*    /'

我不再得到任何输出。我尝试了 CTRL-V,TABTAB。我也尝试过从头开始手动输入整个脚本行,以防某处出现不可打印的内容。为什么 awk 能够处理第一个选项卡,但不能处理第二个?顺便说一句,我已经用 dash、bash 和 zsh 试过了。行为是相同的。

非常感谢。

P.S。我忘了说我的编辑是 vim.

P.P.S

xinput list | awk '/Name of my Device   id[0-9]*    \[slave pointer/' |
    sed 'y/ \t/_$/'

输出:

⎜___↳_Name_of_my_Device$id=12$[slave__pointer__(2)]

事实证明,额外的选项卡有点转移注意力。确实是模式中缺少 = 导致了问题:

xinput list | awk '/Name of my Device id=[0-9]* /'

是更正后的版本。

没有 <tab> 并且没有 = 它可以工作,因为 id[0-9]* 匹配 id 后跟 零个或多个 数字,因此 = 的存在不会终止匹配。但是,一旦您添加 <tab>= 就会妨碍您。

运行

echo ' ↳ Name of my Device  id=12   [slave pointer (2)]' | awk '{sub(/Name of my Device id[0-9]*/, "XXX"); print}'

将说明当 =<tab> 都缺失时匹配的内容。