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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了某些选项卡字符在shell脚本中不匹配,但在命令行上执行相关的知识,希望对你有一定的参考价值。

我正在尝试在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/ 	/_$/'

输出:

⎜___↳_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>都失踪时会得到什么。

以上是关于某些选项卡字符在shell脚本中不匹配,但在命令行上执行的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本常用命令

Shell常用命令

Shell常用命令

bash shell脚本,如何用sed 命令打印出匹配行和匹配行的第N行

Shell脚本命令合集

如何用shell 脚本实现将一个文件某些行写入到另一个临时文件中