0

私は一般的にグロビングにかなり慣れていません。たとえば、「ab」で始まらないが、少なくとも 2 の長さが必要なファイル名に一致するグロブパターンを作成するにはどうすればよいでしょうか? つまり、「"ab" 以外の 2 文字の文字列で始める」 これは宿題の質問であり、基本的な bash グロブのみが許可され、"echo <glob here>" で動作する必要があります。

注:質問は逐語的に

名前に少なくとも 2 文字が含まれているが、ab で始まらない、現在のディレクトリ内の (非表示でない) ファイル。

紙に印刷。私は何も誤解していなかったと確信しています。要件は次のとおりです。

次のファイル検索条件ごとに、条件に一致するグロビング パターンを指定します。それぞれの場合の回答は、次の形式のテキスト ファイルである必要があります。

echo <pattern>

私の現在の試みはecho {a[!b]*,[!a.]?*}、人間の介入なしにテストケースに対して実際にファイルを自動的に実行する自動グレーダーでは、どういうわけかポイントが得られません。

4

4 に答える 4

4

単一の文字の場合、これは次のようになります。

$ echo [!a]?*

ただし、2文字の場合(およびファイルが数字や句読点、またはその他のあらゆる種類のもので始まる可能性があると仮定すると)、次の方法に頼らずにこれを考えることができますshopt

$ GLOBIGNORE=ab* 
$ echo *

さて、技術的には、これはうまくいくでしょう:

$ echo [!a]?* [a][!b]*

しかし、+1 以上の余分な文字で始まるファイル[a][!b]*ない場合、結果に厄介な結果が残りますa。これは望ましくないだけでなく、アプリケーションのバグと見なされることさえあります。有効な答え。それを省略するには[a][!b]*、次のようにする 必要がありますnullglob(許可されていない場合extglobは、nullglobおそらくどちらも許可されていません)。

$ shopt -s nullglob
$ echo [!a]?* [a][!b]*

Fwiw、次のextglobようになります。

$ shopt -s extglob

$ エコー !(ab*) その前の回答は、2 文字未満のファイルに一致するため、@perreal のように:

$ @([^a]?|?[^b])*
于 2013-05-15T00:10:12.517 に答える
2

「a」または「b」で始まるか、「ab」で始まりますか? 後で:

ab*

言うまでもなく、解決するパス (相対または絶対) を指定する必要があります。

/path/to/ab*

あなたの更新された質問に:

{b,c,d,e,f...}{a,c,d,e,f...}*

動作するはずですが、実際には有効ではないことに注意してください。ただし、...ここではアルファベット全体を書きません。:P

于 2013-05-14T23:39:26.320 に答える