某些选项卡字符在shell脚本中不匹配,但在命令行上执行

问题描述 投票:0回答:1

我正在尝试在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)]
regex bash awk zsh dash-shell
1个回答
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>都失踪时会得到什么。

© www.soinside.com 2019 - 2024. All rights reserved.