すべてのファイルを一覧表示し、その中から特定のファイルのみを選択しようとしています。
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_*