我跑:
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 的单词拆分。