分配给变量后,Grep 无法找到序列

分配给变量后,Grep 无法找到序列

我跑:

awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ',' | grep "*)>nS4XkrlH  @XUL"

并且该序列位于结果中。

然后我跑

b=`awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ','`
echo $b | grep "*)>nS4XkrlH  @XUL"

但没有返回结果。

有人知道为什么会发生这种情况吗?

谢谢你的帮助。

答案1

这两个命令序列之间的关键区别在于第二个命令序列包含echo $b执行 shell单词拆分。为了使第二个命令序列与第一个命令序列运行相同,请替换:

echo $b | grep "*)>nS4XkrlH  @XUL"

和:

echo "$b" | grep "*)>nS4XkrlH  @XUL"

单词拆分

echo观察这两个语句中如何处理空格:

$ b="a   b c"
$ echo "$b"
a   b c
$ echo $b
a b c

如果没有双引号,shell 会对 的参数进行分词echo。这意味着所有连续的空格都会缩减为一个空格。如果使用双引号,则会抑制分词,并保留空格。

单词拆分和grep具有多个空格的模式

您的grep模式包含两个连续的空格。除非 的参数echo用双引号引起来,否则 的输出echo将不包含这两个空格,并且不会找到任何匹配项。观察:

$ b="*)>nS4XkrlH  @XUL"
$ echo $b | grep "*)>nS4XkrlH  @XUL"
$ echo "$b" | grep "*)>nS4XkrlH  @XUL"
*)>nS4XkrlH  @XUL

第一个grep不匹配任何内容,但第二个匹配。区别在于 shell 的单词拆分。

相关内容