ファイル名の文字位置でUnixファイル名を検索する

ファイル名の文字位置でUnixファイル名を検索する

2つのファイルがあります。

  1. ファイル1 = ABC2019120601C
  2. ファイル2 = ABC2019120611C

ls -l ABC * Cを入力すると、2つのファイルがすべて出力されます。正しい文字位置でファイルを見つける方法はありますか?

例えば

  • 最初の位置 = A
  • 2番目の位置= B
  • 3番目の位置= C
  • ビット14 = C

これにより、ABC2019120601Cファイルのみが出力されます。可能であれば助けてください。

答え1

ゼロ個以上の文字を一致させる?のではなく、単一の文字を一致させるために使用できます。*例えば

ls -ld ABC??????????C

しかし、参考にしてください両方サンプルファイル名は基準と一致します(12文字目のみ)。

答え2

を使用すると、zsh次のことができます。

set -o extendedglob # best in ~/.zshrc
ls -ld ABC?(#c10)C*

ここでは、前の原子の繰り返し間隔を指定する(#cx,y)正規表現に似ています(ここでは単一文字に一致)。{x,y}?

ksh93の対応する内容は次のとおりです。

ls -ld ABC{10}(?)C*

bash/shには該当しませんが、文字が含まれていないと$IFS仮定すると、?次のことができます。

repeat() {
  awk -- '
    BEGIN {
      for (i = 0; i < ARGV[1]; i++) printf "%s", ARGV[2]
      if (ARGV[1]) printf "\n"
    }' "$@"
}

ls -ld ABC$(repeat 10 '?')C

ksh93 を使用して位置別に検索するには、予測演算子を使用できます。

ls -ld ~(P:(?=.{0}(A))(?=.{1}(B))(?=.{2}(C))(?=.{13}(C))*

オフセットは0、1、2、13です。

  • ~(P:...):ksh93 glob にはさまざまな構文があります。 Perlに似た正規表現がここで使用されます。
  • (?=...)内部的に一致する場合は、幅がゼロの位置で一致するPerlなどの順方向検索アサーションです。
  • .{13}(C):Cの後に13文字が続くものと一致します。すべての(?=...)一致項目の幅が 0 なので、項目の先頭ですべて一致します。 ksh93のバグを修正する.{13}(C)代わりに使用します。.{13}C

を使用すると、zshglob修飾子でPCREマッチングを実行して同じことを実行できます。

set -o rematchpcre
ls -ld *(e['[[ $REPLY =~ "^(?=.{0}A)(?=.{1}B)(?=.{2}C)(?=.{13}C)" ]]'])

または

ls -ld *(e['[[ $REPLY[1,3]$REPLY[14] = ABCC ]]'])

または、次のヘルパー関数を使用してください。

offsets() {
  local c o
  for o c {
    [[ $REPLY[o] = $c ]] || return
  }
}
ls -ld *(e['offsets 1 A 2 B 3 C 14 C'])

関連情報