【发布时间】:2018-11-07 09:37:03
【问题描述】:
我正在尝试在 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]*/'
返回三行数据。一旦我添加另一个选项卡,就像这样:
xinput list | awk '/Name of my Device id[0-9]* /'
我不再得到任何输出。我尝试了 CTRL-V,TAB 和 TAB。我还尝试从头开始手动输入整个脚本行,以防某处有不可打印的内容。为什么awk 能够处理第一个选项卡,而不能处理第二个选项卡?顺便说一句,我已经用 dash、bash 和 zsh 尝试过这个。行为是相同的。
非常感谢。
附:我忘了说我的编辑器是 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的输出是什么 -
好吧,这让我有点难过,但最后这只是一个错字。您在
id[0-9]*中缺少=。试试xinput list | awk '/Name of my Device id=[0-9]* /',应该没问题。 -
另外,您可能会发现使用
\t代替文字制表符更容易:awk '/Name of my Device\tid=[0-9]*\t/'应该也可以工作。 -
没有选项卡和没有
=它可以工作,因为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}'
标签: regex bash awk zsh dash-shell