最初の文字でgrepできません。

最初の文字でgrepできません。

すべてのファイルを一覧表示し、その中から特定のファイルのみを選択しようとしています。 ls -1リストを返す

abc 
abcd
rm_0818-051752-753-06

以降は、この基準選択で 3 行目だけを返そうとするので、次のようにします。

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

しかし、私は何も得られませんでした。

このようにして、3行目の最初の文字を識別しようとしています。

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

この動作を説明し、最初の文字をどのようにキャッチできますか?ありがとう

答え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_*

関連情報