我正在尝试列出所有文件并仅从中选择某些文件。
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 [ K
ANSI 颜色转义,这就是这里出现的问题。您可以通过使用以下版本的非别名来避免这种情况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_*