【问题标题】:CERTAIN tab characters don't match in shell scripts, but do on command-line某些制表符在 shell 脚本中不匹配,但在命令行中匹配
【发布时间】: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,TABTAB。我还尝试从头开始手动输入整个脚本行,以防某处有不可打印的内容。为什么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


【解决方案1】:

原来额外的标签有点像红鲱鱼。实际上,导致问题的模式中缺少=

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> 都丢失时匹配的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 2021-07-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多