无法按第一个字符进行 grep

无法按第一个字符进行 grep

我正在尝试列出所有文件并仅从中选择某些文件。 ls -1把清单还给我

abc 
abcd
rm_0818-051752-753-06

之后我只想按照这个标准选择返回第三行,所以我这样做:

ls -1 | grep -E "^rm_.*"

但我什么也没得到。

我试图以这种方式识别第三行的第一个字符:

var=$(ls -1 | grep -E "rm_")
echo $var //returns rm_0818-051752-753-06
echo ${var:0:1} //returns some strange symbol 001B in square

你能解释一下这种行为以及我如何通过第一个字符 ^ 进行 grep 吗?谢谢

答案1

ls -1 | grep -E "^rm_.*"看起来不错并且应该可以工作。它不起作用的可能原因是别名绑定到ls您的配置文件中的命令。
为了确保,请尝试 /bin/ls -1 | grep -E "^rm_.*"

答案2

听起来您已grep使用别名grep --color=always或类似的名称。您可以通过运行来检查这一点type grep。我可以重现类似的行为:

$ var=$(ls -1 | grep --color=always "^rm")
$ echo ${var:0:1}
## Weird boxed character appears here

为了更好地了解发生了什么,我们可以$var通过od

$ echo "$var" | od -c
0000000 033   [   0   1   ;   3   1   m 033   [   K   r   m 033   [   m
0000020 033   [   K   _   0   8   1   8   -   0   5   1   7   5   2   -
0000040   7   5   3   -   0   6  \n
0000047

033 [ 0 1 ; 3 1 m 033 [ KANSI 颜色转义,这就是这里出现的问题。您可以通过使用以下版本的非别名来避免这种情况grep

/bin/grep '^rm_'

或者

\grep '^rm_'

更好的是,不要解析,ls因为这通常会导致其他问题。一种更安全、更简单的做你想做的事情的方法是:

$ var="rm*"
$ echo $var
rm_0818-051752-753-06
$ echo ${var:0:1}
r

答案3

为什么是 grep,为什么不只是:

ls -1 rm_*

相关内容