shとgrep番号のみ

shとgrep番号のみ

問題があり、考えられる解決策を見つけようとしています。シェン。 Bashが利用可能な場合は、次のコードが機能します。

ls /a|grep ^[0-9]

残念ながら、shの場合はそうではありません。はい、shを使用する必要があります。 :) 実行sh私は取得

ls /a |grep ^[0-9]
[0-9]: not found
Usage: grep -hblcnsviw pattern file . . .

^を削除すると、コードは機能しますが、数字を含むファイルではなく数字で始まるファイルのみが必要です。たとえば、次のようなファイルが必要です。

12.00.2
2.222.1234.12

grepのマニュアルページから^

現在、私の実装は次のように行われます。

ls /a|grep -v [a-z]|grep -v [A-Z]

これにより、文字を含むすべてのファイルが削除されますが、ファイルが.123.33の場合は引き続き表示されます。

答え1

次のことがあなたに役立つでしょう:

ls /a | egrep "^[0-9]"

これは@Anthonsのフィードバックによってはegrep使用されなくなり、-Eトグルを通常のコマンドとして使用できますgrep

ls /a | grep -E "^[0-9]"

@Stephaneからのフィードバックに基づいています拡大するこの場合、正規表現(ERE)も必要ありません。本当に重要なのは、^[0-9]問題のあるバージョンを使用しても解釈されないようにする引用です。/bin/shしたがって、次の方法が問題を解決する最も簡単な方法になります。

ls /a | grep "^[0-9]"

-または-

ls /a | grep '^[0-9]'

答え2

sh90年代半ば以前のほとんどのUnixシステムのシェルであり、/bin/shSolaris 11より前のSolarisで使用されていたBourneシェルを話しているようです。

Solaris 10以前では使用しないでください/bin/sh。そのシェルは異なる時代のものです。代わりに使用してください/usr/xpg4/bin/sh

Bourneシェルには、以前のシェルであるThompsonシェルとの互換性のため^のエイリアスがあります。|したがって、あなたのコマンドは次のようになります。

ls /a|grep |[0-9]

Bourneシェルは呼び出されたコマンドが見つからないと報告し、引数を[0-9]受け取っgrepていないと文句を言います。

Bourne Shellが標準を使用していない場合でも、shこれを引用することをお勧めします。たとえば、^拡張グローバルオプションが有効な場合は^グローバル演算子です。zsh

とにかくそうでない場合はワイルドカードなので、^引用する必要があります。現在のディレクトリにある1桁の名前のファイルのリストにシェルを展開します。[0-9][0-9]

だから:

ls /a | grep '^[0-9]'

ところでBourneシェルでは

ls /a ^ grep '^[0-9]'

動作します。

答え3

必要ではなく、lsこれgrepには簡単なものを使用できます。全体的な状況 /a/[0-9]*:

echo /a/[0-9]*
ls /a/[0-9]*
grep foo /a/[0-9]*

スクリプトでこれを使用している場合は注意してください出力を解析するlsのは悪い考えです。

答え4

私はl0b0 grepがここで悪い考えであることに同意しますが、とにかくここに問題の説明と解決策があります。 Solaris 10 以降では廃止予定のシェルな/bin/shので、従来のスクリプトの実行以外の目的には使用しないでください。代わりに、kshまたはbashを使用する必要があります/usr/xpg4/bin/sh

ここでの根本的な原因は、^初期のUnix時代にパイプが指定された原始的な方法によるものです。ソラリスは/bin/shこの考古学的特徴を受け継いだ。

回避策は非常に簡単です。次のいずれかの方法でキャレットをエスケープします。

ls /a |grep \^[0-9]

または

ls /a |grep "^[0-9]"

または

ls /a |grep '^[0-9]'

関連情報